Cara terbaik untuk menulis ke konsol di PowerShell

142

Saya mengalami sedikit kebingungan tentang berbagai cara untuk mencetak (gema) ke konsol. Saya telah melihat bahwa ada beberapa cara untuk menulis keluaran ke konsol, seperti:

Write-Host "Hello world1"
"Hello World2"
Out-Host -InputObject "Hello World3"

Ketiga cara akan mencetak ke konsol. Yang tengah entah bagaimana lebih sederhana dan kurang bertele-tele dan lebih mudah digunakan. Saya juga menemukan bahwa ketika Anda menulis fungsi seperti:

function GetValues()
{
    "1"
    "2"
}

Masih mengembalikan dua string dalam pipa:

Dan saya masih bisa mencetak nilai-nilai:

foreach ($s in GetValues)
{
    Write-Host "s: " $s
}

Hal yang saya temukan adalah bahwa hanya menggunakan string yang dikutip tidak selalu muncul pada host kustom, dan bahwa saya harus menggunakan Write-Host untuk mendapatkan nilai untuk mencetak pada host kustom.

Entah bagaimana saya menemukan ini membingungkan. Apakah "Print something"seharusnya alias Write-Hostatau apa maksudnya?

Andre
sumber

Jawaban:

101

Perilaku default PowerShell adalah hanya membuang semua yang jatuh dari pipa tanpa diambil oleh elemen pipa lain atau ditugaskan ke variabel (atau dialihkan) ke Out-Host. Apa yang Out-Hostdilakukan jelas tergantung pada host.

Hanya membiarkan hal-hal yang keluar dari pipa bukanlah pengganti Write-Hostyang ada hanya untuk alasan menghasilkan teks dalam aplikasi host.

Jika Anda ingin keluaran, gunakan Write-*cmdlet. Jika Anda ingin mengembalikan nilai dari suatu fungsi, maka cukup buang objek di sana tanpa cmdlet.

Joey
sumber
1
Saya telah mengetiknya dalam skrip .vbs. Hanya baris kode itu dan itu membuat saya kesalahan.
FrenkyB
58

Yang tengah menulis ke saluran pipa. Write-Hostdan Out-Hostmenulis ke konsol. 'echo' adalah alias Write-Outputyang juga menulis ke saluran pipa. Cara terbaik untuk menulis ke konsol adalah menggunakan Write-Hostcmdlet.

Ketika sebuah objek ditulis ke pipeline, ia dapat dikonsumsi oleh perintah lain dalam rantai. Sebagai contoh:

"hello world" | Do-Something

tetapi ini tidak akan berfungsi sejak Write-Hostmenulis ke konsol, bukan ke saluran pipa (Do-Something tidak akan mendapatkan string):

Write-Host "hello world" | Do-Something
Shay Levy
sumber
3
Jawaban ini secara teknis benar, tetapi saya menduga itu akan menyesatkan pengguna PowerShell yang baru. Aturan pertama PowerShell yang efektif adalah menghasilkan output yang berguna dalam pipa. Jika Anda menggunakan Write-Host sangat banyak, Anda mungkin salah melakukannya.
OldFart
6
Nah, bukankah itu yang ditanyakan OP, bagaimana menulis ke konsol? Ada perbedaan antara menulis ke host dan menulis ke pipa, dan kita harus tahu apa yang masing-masing lakukan. Saya akan memperbarui jawaban saya dengan klarifikasi.
Shay Levy