Perbedaan PowerShell antara Write-Host dan Write-Output?

Jawaban:

82

Singkatnya, Write-Hostmenulis ke konsol itu sendiri. Anggap saja sebagai MsgBox di VBScript . Write-Output, di sisi lain, menulis ke pipeline, sehingga perintah berikutnya dapat menerimanya sebagai inputnya. Anda tidak diharuskan menggunakan Write-Outputuntuk menulis objek, seperti Write-Outputyang secara implisit dipanggil untuk Anda.

PS> Get-Service

akan sama dengan:

PS> Get-Service | Write-Output
Shay Levy
sumber
16
Powershell sangat membingungkan dengan cara ini. Layak untuk membaca tautan ini untuk merasakan pipline yang disebutkan di PowerShell, dan bagaimana nilai dikembalikan dari suatu fungsi. "Kata kunci kembali di PowerShell menyesatkan - sejujurnya, saya menghindarinya, karena tidak berfungsi sama sekali seperti kebanyakan bahasa pemrograman." - powershell.org/forums/topic/…
Jim Aho
1
Jika Anda memanggil fungsi yang memiliki nilai kembalian, JANGAN gunakan Output-Tulis dalam fungsi itu atau string itu akan dikembalikan sebagai ganti nilai kembalian Anda. Yang bisa menyebabkan segala macam malapetaka.
Brain2000
29

Write-Output mengirimkan output ke pipeline. Dari sana dapat disalurkan ke cmdlet lain atau ditugaskan ke variabel. Write-Host mengirimkannya langsung ke konsol.

$a = 'Testing Write-OutPut'  | Write-Output
$b = 'Testing Write-Host' | Write-Host

Get-Variable a,b

Keluaran:

Testing Write-Host

Name                           Value                                                                 
----                           -----                                                                 
a                              Testing Write-OutPut                                                  
b                                                  

Jika Anda tidak memberi tahu Powershell apa yang harus dilakukan dengan output ke pipeline dengan menetapkannya ke variabel atau menyalurkannya ke perintah lain, maka itu akan dikirim ke out-default, yang biasanya adalah konsol sehingga hasil akhirnya muncul sama .

mjolinor.dll
sumber
9

Write-Outputmengirimkan data sebagai objek melalui pipa. Dalam contoh Pertanyaan itu hanya akan melewatkan sebuah string.

write-hosttergantung pada host. Di konsol write-hostpada dasarnya melakukan [console]::WriteLine. Lihat ini untuk info lebih lanjut.

Chad Carisch
sumber
4
Hanya untuk memperjelas bagi pembaca selanjutnya. Write-Ouputmengirimkan benda. Kali ini adalah string, tetapi secara umum akan mengirim objek, dan biasanya tidak perlu digunakan karena ini adalah cara default untuk menampilkan hasil / data :)
Frode F.
5

Perbedaan lain antara Write-Host dan Write-Output:

  • Write-Host menampilkan pesan di layar, tetapi tidak menulisnya ke log

  • Write-Output menulis pesan ke log, tetapi tidak menampilkannya di layar.

Dan Write-Host dianggap berbahaya. Anda dapat melihat penjelasan rinci di Write-Host Dianggap Berbahaya .

Musim panas
sumber
2
Saya menemukan Write-Output jauh lebih berbahaya. Bagaimana Anda memastikan bahwa suatu fungsi benar-benar mengembalikan hasil yang diharapkan dan bukan keluaran sampah yang tidak diharapkan dari sebuah perintah?
MKesper
6
Saya pikir Write-Outputmenampilkan pesan di layar, jika Anda menjalankan skrip sendiri. Jadi saya tidak yakin apa yang Anda maksud dengan "Write-Output menulis pesan ke log, tetapi tidak menampilkannya di layar." ?
Jim Aho
Anda tidak dapat membuat Write-Output mengembalikan informasi ke layar jika digunakan di dalam fungsi yang Anda gunakan untuk menangkap output ke variabel. Bahkan dapat merusak hasilnya. Write-Host lebih cocok untuk ini.
galmok
@Summer Write-Output berbahaya, Write-Information sangat bagus. Write-Output adalah musuh dari fungsi Powershell yang memiliki nilai balik.
Brain2000
Menurut dokumen , "Dimulai pada Windows PowerShell 5.0, Write-Host adalah pembungkus untuk Write-Information. Hal ini memungkinkan Anda menggunakan Write-Host untuk memancarkan keluaran ke aliran informasi."
Phistrom
0

Anda dapat memahami perbedaan antara kedua cmds dengan contoh di bawah ini:

Write-host "msgtxt" | Get-Service Saat dijalankan di atas, Anda akan mendapatkan keluaran sebagai "msgtxt"

Output-tulis "msgtxt" | Get-Service Saat menjalankan di atas, Anda akan menerima error karena msgtxt bukanlah nama layanan apa pun. (Dalam kondisi ideal) (Karena Anda menulisnya ke pipeline dan dikirimkan sebagai input ke Get-Service)

LAKSHAY ARORA
sumber