Perbarui :
if ($LASTEXITCODE -eq 0) ...pendekatan akan terus bekerja dengan kuat dengan program eksternal.- Namun, jika dan ketika pra-v7.2 fitur eksperimental
bernama
PSNotApplyErrorActionToStderrmenjadi fitur resmi,if ($?) ...akan bekerja dengan kuat juga - lihat jawaban ini untuk informasi lebih lanjut.
Gunakan $LASTEXITCODE -eq 0 bukannya $? untuk mendeteksi kode keluar bukan nol dengan andal (biasanya kegagalan sinyal) yang dilaporkan oleh program eksternal.
Anda kemudian dapat menggunakan *> $null untuk menekan semua keluaran secara kategoris tanpa harus khawatir tentang dampak pengalihan tersebut pada $? :
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Menggunakan pengalihan yang melibatkan aliran kesalahan PowerShell - baik secara eksplisit melalui 2> atau secara implisit melalui *> - artinya jika ada data yang diterima melalui aliran itu - yang dalam hal memanggil program eksternal berarti keluaran apa pun dari stderr - PowerShell menyetel $? ke $false .
Namun, di bidang program konsol/terminal eksternal, stderr tidak hanya digunakan untuk menampilkan error informasi, tetapi informasi apa pun yang bukan data , seperti informasi status. Oleh karena itu, Anda tidak dapat menyimpulkan kegagalan dari keberadaan keluaran stderr .
Program konsol/terminal eksternal mengomunikasikan status keberhasilannya hanya melalui kode keluar , yang dicerminkan oleh PowerShell dalam $LASTEXITCODE automatic otomatis variabel.
Dari penjelasan di atas, $? bisa $false bahkan jika kode keluarnya adalah 0 , jadi ini bukan indikator keberhasilan yang dapat diandalkan - tidak seperti $LASTEXITCODE .