Setara dengan Echo di PowerShell untuk pengujian skrip

233

Saya ingin menampilkan variabel dan nilai-nilai dalam skrip PowerShell dengan mengatur bendera dan melihat data matriculate seluruh skrip.

Bagaimana saya melakukan ini?

Misalnya, apa yang akan menjadi setara PowerShell dengan kode PHP berikut?

echo "filesizecounter: " . $filesizecounter 
phill
sumber
Lihat skrip-editor / debugger yang disertakan dengan PowerGUI . Mungkin cocok untuk apa yang Anda lakukan. Saya mengerti bahwa Powershell 2 juga dilengkapi dengan debugger (tapi saya belum mencobanya).
dan-gph

Jawaban:

275

Ada beberapa cara:

Write-Host: Menulis langsung ke konsol, tidak termasuk dalam fungsi / output cmdlet. Mengizinkan warna latar depan dan latar belakang diatur.

Write-Debug: Menulis langsung ke konsol, jika $DebugPreferencediatur ke Lanjutkan atau Berhenti.

Write-Verbose: Menulis langsung ke konsol, jika $VerbosePreferencediatur ke Lanjutkan atau Berhenti.

Yang terakhir ini dimaksudkan untuk informasi tambahan opsional, Write-Debuguntuk debugging (jadi sepertinya cocok dalam kasus ini).

Tambahan : Dalam PSH2 (setidaknya) skrip yang menggunakan pengikatan cmdlet akan secara otomatis mendapatkan -Verbosedan -Debugmengganti parameter, mengaktifkan secara lokal Write-Verbosedan Write-Debug(yaitu mengesampingkan variabel preferensi) seperti yang dilakukan oleh cmdlet dan penyedia yang dikompilasi.

Richard
sumber
4
Hal yang menyenangkan tentang Write-Debug dan Write-Verbose adalah Anda dapat meninggalkan pernyataan debug dalam kode Anda, dan cukup nyalakan output ketika Anda membutuhkannya menggunakan variabel preferensi yang sesuai. Menghemat waktu dan merupakan fitur yang bagus untuk pengguna lain dari fungsi Anda.
JasonMArcher
5
Anda juga ingin membiasakan diri dengan String-Keluar, karena dengan objek non-sepele, Anda harus menggunakannya untuk mengubah objek menjadi string yang dapat ditampilkan sebelum menggunakan salah satu dari tiga cmdlet Write-* tersebut.
Jaykul
113

Powershell memiliki gema pemetaan alias untuk Write-Output, jadi:

echo "filesizecounter : $filesizecounter"

Justin R.
sumber
7
echoadalah alias untuk Write-Outputsesuai TechNet Microsoft dan dibahas di sini
Glenn Lawrence
2
Terima kasih Glenn, sepertinya alias telah dipetakan ulang dalam 6 tahun sejak saya memposting ini. Yang mana bagus, orang seharusnya tidak menggunakan Write-Host karena melewati jalur pipa. Saya telah memperbarui balasan saya untuk menunjukkan ini. Terima kasih!
Justin R.
3
Mengapa Anda tidak ingin melewati jalur pipa jika semua yang ingin Anda lakukan adalah gema "debug" output ke konsol untuk melacak eksekusi skrip? Write-Output memiliki efek samping yang aneh di mana konten panggilan terakhir ke Write-Output akan ditinggalkan di tumpukan, menimpa variabel apa pun yang Anda coba untuk kembali secara eksplisit dari suatu fungsi. Efek samping seperti itu terasa seperti cara yang sangat kacau untuk suatu bahasa berperilaku.
Craig
33

Interpolasi PowerShell, bukan?

Dalam PHP

echo "filesizecounter: " . $filesizecounter 

dapat juga ditulis sebagai:

echo "filesizecounter: $filesizecounter" 

Di PowerShell sesuatu seperti ini harus sesuai dengan kebutuhan Anda:

Write-Host "filesizecounter: $filesizecounter"
John T
sumber
9
PHP tidak ada hubungannya dengan apa pun dalam pertanyaan ini
reggaeguitar
25
Write-Host "filesizecounter : " $filesizecounter 
kata mutiara
sumber
14

Sejauh ini cara termudah untuk bergema di PowerShell, cukup buat objek string dan biarkan pipeline mengeluarkannya:

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

Tentu saja, Anda memberikan sedikit fleksibilitas ketika tidak menggunakan metode Write- *.

Goyuix
sumber
9

echo adalah alias untuk Write-Output meskipun terlihat sama dengan Write-Host .

Bukan Apa perbedaan antara echo dan Write-Host di PowerShell? .

gema adalah alias untuk Write-Output, yang menulis ke aliran output Sukses. Ini memungkinkan output diproses melalui jalur pipa atau dialihkan ke file. Write-Host menulis langsung ke konsol, sehingga output tidak dapat diarahkan / diproses lebih jauh.

Paul Fijma
sumber
8

Write-host berfungsi dengan baik.

$Filesize = (Get-Item $filepath).length;
Write-Host "FileSize= $filesize";
ali Darabi
sumber
5

Saya tidak tahu apakah itu bijaksana untuk melakukannya, tetapi Anda bisa menulis

"filesizecounter: " + $filesizecounter

Dan itu akan menghasilkan:

filesizecounter: value

Peter
sumber
1
"filesizecounter: $filesizecounter"bahkan lebih pendek.
jiggunjer
3

PowerShell memiliki alias untuk beberapa perintah umum seperti echo. Ketik yang berikut ini di PowerShell:

Get-Alias echo

untuk mendapat respons:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           echo -> Write-Output

Bahkan Get-Alias ​​memiliki alias gal -> Get-Alias. Anda dapat menulis gal echountuk mendapatkan alias untuk echo.

gal echo

Alias ​​lain tercantum di sini: https://docs.microsoft.com/en-us/powershell/scripting/learn/using-familiar-command-names?view=powershell-6

cat dir mount rm cd echo move rmdir chdir erase popd sleep clear h ps sort cls history pushd tee copy kill pwd type del lp r write diff ls ren

Russ Van Bert
sumber
2

Coba Get-Content .\yourScript.PS1dan Anda akan melihat konten skrip Anda.

Anda juga dapat memasukkan baris ini dalam kode skrip Anda:

get-content .\scriptname.PS1
script code
script code

....

Luis
sumber
Tidak menunjukkan nilai aktual yang diproses (mis. Substitusi env var) jadi bukan jawaban untuk pertanyaan yang diajukan.
iisystems
0

Juga harus disebutkan, bahwa Set-PSDebug mirip dengan echo onperintah batch old-school :

Set-PSDebug -Trace 1

Perintah ini akan menghasilkan menampilkan setiap baris skrip pelaksana:

Ketika Traceparameter memiliki nilai 1, setiap baris skrip dilacak saat dijalankan. Ketika parameter memiliki nilai 2, penugasan variabel, panggilan fungsi, dan panggilan skrip juga dilacak. Jika parameter Langkah ditentukan, Anda diminta sebelum setiap baris skrip berjalan.

lauxjpn
sumber