Ada sejumlah cara berbeda untuk menghasilkan pesan. Apa perbedaan efektif antara keluaran sesuatu melalui Write-Host
, Write-Output
atau [console]::WriteLine
?
Saya juga perhatikan bahwa jika saya menggunakan:
write-host "count=" + $count
Akan +
dimasukkan dalam output. Kenapa begitu? Tidakkah ungkapan itu harus dievaluasi untuk menghasilkan satu string gabungan sebelum ditulis?
powershell
Scott Langham
sumber
sumber
Write-Output
ketika Anda memancarkan hasil.Write-Host
ketika Anda memancarkan informasi logging. Jangan pernah gunakan[console]::writeline()
.[console]::writeline("hello world")
Anda tidak dapat melakukannyaWrite-Host "hello world"
. Jawaban lain yang lebih baik, lebih baru berlaku adalah yangwrite-host
membungkuswrite-information
sehingga datanya dimasukkan ke aliran sepertiwrite-error
sehingga Anda dapat menangkapnya dan menggunakannya di tempat lain.[console]::writeline()
tidak melakukan ituJawaban:
Write-Output
harus digunakan ketika Anda ingin mengirim data pada saluran pipa, tetapi tidak selalu ingin menampilkannya di layar. Pipa akhirnya akan menuliskannyaout-default
jika tidak ada orang lain yang menggunakannya terlebih dahulu.Write-Host
harus digunakan ketika Anda ingin melakukan yang sebaliknya.[console]::WriteLine
pada dasarnya adalah apaWrite-Host
yang dilakukan di balik layar.Jalankan kode demonstrasi ini dan periksa hasilnya.
Anda harus melampirkan operasi penggabungan dalam tanda kurung, sehingga PowerShell memproses penggabungan sebelum tokenizing daftar parameter untuk
Write-Host
, atau menggunakan interpolasi stringBTW - Tonton video Jeffrey Snover ini menjelaskan cara kerja pipeline. Kembali ketika saya mulai belajar PowerShell saya menemukan ini menjadi penjelasan yang paling berguna tentang cara kerja pipeline.
sumber
Write-Output
adalah defaultnya misalnya jika Anda memiliki PsObject dan Anda hanya memuntahkannya ke layar dengan melakukan ini,$object
itu sebenarnya akan melakukan hal yang sama seperti iniWrite-Output $object
. Mungkin layak disebutWrite-Output
jika memungkinkan. Lihat github.com/PoshCode/PowerShellPracticeAndStyle/issues/… > Gunakan pengembalian hanya untuk mengakhiri eksekusi. > Hindari Write-Output (...). Sebagai gantinya, ketika Anda ingin membuat output lebih jelas, tetapkan saja output ke variabel bernama relevan. dan menempatkan variabel pada baris dengan sendirinya untuk menandakan output eksplisit. > Write-Output -NoEnumerate rusak di PowerShell 6 dan telah selama 16 bulan atau lebih - tidak ada rencana untuk memperbaikinya. Singkatnya:> JANGAN GUNAKAN Write-Output - EVER.Terlepas dari apa yang disebutkan Andy, ada perbedaan lain yang penting - write-host langsung menulis ke host dan tidak mengembalikan apa pun, artinya Anda tidak dapat mengarahkan ulang output, misalnya, ke file.
Sekarang jalankan di PowerShell:
Seperti yang terlihat, Anda tidak dapat mengarahkan mereka ke file. Ini mungkin mengejutkan bagi seseorang yang tidak berhati-hati.
Tetapi jika beralih menggunakan write-output sebagai gantinya, Anda akan mendapatkan pengalihan berfungsi seperti yang diharapkan.
sumber
Berikut cara lain untuk mencapai yang setara dengan Write-Output. Masukkan saja string Anda ke dalam tanda kutip:
Anda dapat memastikan ini bekerja sama dengan Write-Output dengan menjalankan percobaan ini:
Dua yang pertama akan menampilkan "blah blah" ke out.txt, tetapi yang ketiga tidak.
"help Write-Output" memberikan petunjuk tentang perilaku ini:
Dalam kasus ini, string itu sendiri "count = $ count" adalah objek di akhir pipa, dan ditampilkan.
sumber
Untuk penggunaan
Write-Host
,PSScriptAnalyzer
buat diagnostik berikut:Lihat dokumentasi di balik aturan itu untuk informasi lebih lanjut. Kutipan untuk anak cucu:
Jeffrey Snover memiliki posting blog Write-Host Dianggap Berbahaya di mana ia mengklaim Write-Host hampir selalu merupakan hal yang salah untuk dilakukan karena mengganggu otomatisasi dan memberikan lebih banyak penjelasan di balik diagnostik, namun di atas adalah ringkasan yang baik.
sumber
Dari pengujian saya Write-Output dan [Console] :: WriteLine () berkinerja lebih baik daripada Write-Host.
Tergantung pada seberapa banyak teks yang Anda butuhkan untuk menulis ini mungkin penting.
Di bawah ini jika hasil masing-masing dari 5 tes untuk Write-Host, Write-Output dan [Console] :: WriteLine ().
Dalam pengalaman saya yang terbatas, saya telah menemukan ketika bekerja dengan segala jenis data dunia nyata saya harus meninggalkan cmdlet dan langsung menuju perintah tingkat yang lebih rendah untuk mendapatkan kinerja yang layak dari skrip saya.
sumber
Write-Output
danWrite-Host
melayani tujuan yang berbeda, sehingga tidak ada gunanya membandingkan kinerja mereka. Ya, penggunaan langsung tipe .NET dan metodenya lebih cepat, tetapi Anda kehilangan fitur tingkat tinggi yang dapat disediakan PowerShell cmdlet.[Console]::WriteLine()
miripWrite-Host
dalam kasus yang dihadapi, tetapi tidak akan berfungsi dalam semua keadaan, karena tidak semua host PowerShell adalah konsol .Mengenai [Konsol] :: WriteLine () - Anda harus menggunakannya jika Anda akan menggunakan saluran pipa di CMD (bukan di powershell). Katakanlah Anda ingin ps1 Anda untuk mengalirkan banyak data ke stdout, dan beberapa utilitas lain untuk mengkonsumsi / mengubahnya. Jika Anda menggunakan Write-Host dalam skrip, itu akan jauh lebih lambat.
sumber