Saya menjalankan skrip PowerShell dari dalam file batch. Script mengambil halaman web dan memeriksa apakah konten halaman adalah string "OK".
Skrip PowerShell mengembalikan tingkat kesalahan ke skrip batch.
Script batch dijalankan oleh ScriptFTP , sebuah program otomatisasi FTP. Jika terjadi kesalahan, saya dapat meminta ScriptFTP mengirim output konsol penuh ke administrator melalui E-Mail.
Dalam skrip PowerShell, saya ingin menampilkan nilai kembali dari situs web jika bukan "OK", sehingga pesan kesalahan akan dimasukkan dalam output konsol, dan dengan demikian dalam surat status.
Saya baru mengenal PowerShell dan tidak yakin fungsi keluaran mana yang digunakan untuk ini. Saya dapat melihat tiga:
- Tuan Rumah Penulis
- Tulis-Output
- Tulis-Kesalahan
Apa hal yang benar untuk digunakan untuk menulis ke Windows yang setara stdout
?
sumber
"Hello, World!" | Out-Host
.Out-Host
di sisi lain mengirim objek ke host PowerShell untuk tampilan dan implementasinya tergantung pada host. Host konsol mengirimkannya ke pegangan keluaran standar (melewatiOut-Default
sepanjang jalan), memang. PowerShell ISE menampilkannya di panel output, namun, dan host lain mungkin melakukan hal lain sama sekali.Get-ChildItem
output datang dalam bentuk tabel, misalnya, dan hasilnya dengan banyak properti (misalnya WMI)Format-List
sebagai gantinya.Saya pikir dalam hal ini Anda akan membutuhkan Write-Output .
Jika Anda memiliki skrip seperti
kemudian, jika Anda memanggil skrip dengan output redirected, sesuatu seperti
yourscript.ps1 > out.txt
, Anda akan mendapatkantest2
di layartest1\ntest3\n
di "out.txt".Perhatikan bahwa "test3" dan baris Write-Output akan selalu menambahkan baris baru ke teks Anda dan tidak ada cara di PowerShell untuk menghentikan ini (artinya,
echo -n
tidak mungkin di PowerShell dengan perintah asli). Jika Anda ingin ( Bash ) fungsionalitas yang agak dasar dan mudahecho -n
kemudian lihat jawaban samthebest .Jika file batch menjalankan perintah PowerShell, kemungkinan besar akan menangkap perintah Write-Output. Saya telah melakukan "diskusi panjang" dengan administrator sistem tentang apa yang harus ditulis ke konsol dan apa yang tidak. Kami sekarang telah sepakat bahwa satu-satunya informasi jika skrip dieksekusi berhasil atau mati harus di
Write-Host
-red, dan segala sesuatu yang penulis skrip mungkin perlu ketahui tentang eksekusi (item apa yang diperbarui, bidang apa yang ditetapkan, dan lain-lain) berjalan untuk Menulis-Output. Dengan cara ini, ketika Anda mengirimkan skrip ke administrator sistem, ia dapat dengan mudahrunthescript.ps1 >someredirectedoutput.txt
dan melihat di layar, jika semuanya OK. Lalu kirim "someredirectedoutput.txt" kembali ke pengembang.sumber
Saya pikir berikut ini adalah pameran Echo vs Write-Host yang bagus . Perhatikan bagaimana test () benar-benar mengembalikan array int, bukan int tunggal karena seseorang dapat dengan mudah dituntun untuk percaya.
Output terminal di atas:
sumber
$x = test
hanya mencetak123
dan tidak juga456
?Anda dapat menggunakan semua ini dalam skenario Anda karena mereka menulis ke aliran default (output dan kesalahan). Jika Anda mem-piping output ke commandlet lain Anda ingin menggunakan Write-Output , yang pada akhirnya akan berakhir di Write-Host .
Artikel ini menjelaskan berbagai opsi keluaran: PowerShell O untuk Output
sumber
Magenta dapat menjadi salah satu dari nilai enumerator "System.ConsoleColor" - Hitam, DarkBlue, DarkGyan, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Abu-abu, DarkGray, Biru, Hijau, Cyan, Merah, Magenta, Kuning, Putih.
Ini
+ $File.FullName
opsional, dan menunjukkan cara memasukkan variabel ke dalam string.sumber
Anda tidak bisa mendapatkan PowerShell untuk mengabaikan baris baru yang sial itu. Tidak ada skrip atau cmdlet yang melakukan ini.
Tentu saja Write-Host benar-benar omong kosong karena Anda tidak dapat mengalihkan / menyalurkannya! Anda hanya perlu menulis sendiri:
Misalnya
sumber
Dalam efek , tapi sangat sayangnya , baik Windows PowerShell dan PowerShell Core dari v7.0, mengirim semua dari mereka 6 (!) Keluaran aliran ke stdout ketika dipanggil dari luar , melalui PowerShell ini CLI .
Lihat masalah GitHub ini untuk diskusi tentang perilaku bermasalah ini, yang kemungkinan tidak akan diperbaiki demi kompatibilitas ke belakang.
Dalam praktiknya, ini berarti bahwa aliran PowerShell apa pun yang Anda kirim akan dilihat sebagai keluaran stdout oleh penelepon eksternal:
Misalnya, jika Anda menjalankan berikut dari
cmd.exe
, Anda akan melihat ada output, karena stdout pengalihan untukNUL
berlaku sama untuk semua PowerShell stream:C:\>powershell -noprofile -command "Write-Error error!" >NUL
Namun - anehnya - jika Anda mengarahkan stderr , PowerShell tidak mengirim aliran kesalahan untuk stderr , sehingga dengan
2>
Anda dapat menangkap output kesalahan-aliran selektif; output berikut hanya'hi'
- output stream-berhasil - sambil menangkap output stream-kesalahan dalam fileerr.txt
:C:\>powershell -noprofile -command "'hi'; Write-Error error!" 2>err.txt
The diinginkan perilaku adalah:
1
) PowerShell ke stdout .Kirim output dari semua stream lain ke stderr , yang merupakan satu-satunya pilihan, mengingat bahwa antara proses hanya ada 2 stream output yang ada - stdout (output standar) untuk data , dan stderr (standard error) untuk pesan kesalahan dan semua jenis pesan lainnya - seperti sebagai informasi status - itu bukan data .
Dianjurkan untuk membuat perbedaan ini dalam kode Anda, meskipun saat ini tidak dihormati .
Di dalam PowerShell :
Write-Host
adalah untuk tampilan output , dan mem - bypass aliran output yang sukses - dengan demikian, outputnya tidak dapat (secara langsung) ditangkap dalam suatu variabel atau ditekan atau dialihkan.Maksud aslinya adalah hanya untuk membuat umpan balik pengguna dan membuat antarmuka pengguna yang sederhana dan berbasis konsol (keluaran berwarna).
Karena ketidakmampuan sebelum ditangkap atau diarahkan, PowerShell versi 5 yang dibuat
Write-Host
untuk yang baru diperkenalkan aliran informasi (nomor6
), sehingga sejak itu adalah mungkin untuk menangkap dan redirectWrite-Host
output.Write-Error
dimaksudkan untuk menulis kesalahan yang tidak berakhir ke aliran kesalahan (angka2
); secara konseptual, aliran kesalahan adalah setara dengan stderr.Write-Output
menulis untuk aliran [keluaran] sukses (angka1
), yang secara konseptual setara dengan stdout; itu adalah aliran untuk menulis data (hasil) ke.Write-Output
jarang diperlukan karena fitur output implisit PowerShell :Write-Output "Honey, I'm $HOME"
dan"Honey, I'm $HOME"
setara, dengan yang terakhir tidak hanya lebih ringkas, tetapi juga lebih cepat.sumber