Perbarui :
if ($LASTEXITCODE -eq 0) ...
pendekatan akan terus bekerja dengan kuat dengan program eksternal.- Namun, jika dan ketika pra-v7.2 fitur eksperimental
bernama
PSNotApplyErrorActionToStderr
menjadi 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
.