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à
PSNotApplyErrorActionToStderrtrở 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 .