Cập nhật :
-
if ($LASTEXITCODE -eq 0) ...
phương pháp tiếp cận sẽ tiếp tục hoạt động hiệu quả với các chương trình bên ngoài. - Tuy nhiên, nếu và khi phiên bản trước v7.2 tính năng thử nghiệm
được đặt tên là
PSNotApplyErrorActionToStderr
trở thành một tính năng chính thức,if ($?) ...
cũng sẽ hoạt động mạnh mẽ - hãy xem câu trả lời này để biết thêm thông tin.
Sử dụng $LASTEXITCODE -eq 0
thay vì $?
để phát hiện một cách đáng tin cậy mã thoát khác không (thường là lỗi báo hiệu) do chương trình bên ngoài báo cáo.
Sau đó, bạn có thể sử dụng *> $null
để loại bỏ tất cả đầu ra mà không phải lo lắng về tác động của việc chuyển hướng đó đối với $?
:
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
Sử dụng chuyển hướng liên quan đến luồng lỗi của PowerShell - rõ ràng qua 2>
hoặc ngầm định qua *>
- có nghĩa là nếu bất kỳ dữ liệu nào được nhận qua luồng đó - trong trường hợp gọi chương trình bên ngoài có nghĩa là bất kỳ đầu ra nào từ stderr - Bộ PowerShell $?
thành $false
.
Tuy nhiên, trong lĩnh vực của các chương trình bảng điều khiển / thiết bị đầu cuối bên ngoài, stderr không chỉ được sử dụng để xuất ra error thông tin, nhưng bất kỳ thông tin nào không phải là dữ liệu , chẳng hạn như thông tin trạng thái. Do đó, bạn không thể suy ra thất bại khi có đầu ra stderr .
Các chương trình bảng điều khiển / thiết bị đầu cuối bên ngoài thông báo trạng thái thành công của chúng chỉ thông qua mã thoát , PowerShell phản ánh trong $LASTEXITCODE
tự động biến.
Nó theo sau $?
ở trên có thể là $false
ngay cả khi mã thoát là 0
, vì vậy nó không phải là một chỉ báo thành công đáng tin cậy - không giống như $LASTEXITCODE
.