Tôi muốn tập lệnh PowerShell của mình dừng khi bất kỳ lệnh nào tôi chạy không thành công (như set -e
trong bash). Tôi đang sử dụng cả hai lệnh Powershell (New-Object System.Net.WebClient
) và các chương trình (.\setup.exe
).Làm cách nào để dừng tập lệnh PowerShell trên lỗi đầu tiên?
Trả lời
$ErrorActionPreference = "Stop"
sẽ giúp bạn trở thành một phần của cách đó (tức là điều này rất hữu ích cho các lệnh ghép ngắn).
Tuy nhiên đối với EXE, bạn sẽ cần phải tự mình kiểm tra $LastExitCode
sau mỗi lần gọi exe và xác định xem điều đó có thất bại hay không. Rất tiếc, tôi không nghĩ PowerShell có thể trợ giúp ở đây vì trên Windows, EXE không nhất quán về những gì cấu thành mã thoát "thành công" hoặc "không thành công". Hầu hết theo tiêu chuẩn UNIX của 0 cho thấy thành công nhưng không phải tất cả đều làm. Hãy xem CheckLastExitCode function in this blog post. Bạn có thể thấy nó hữu ích.
Bạn sẽ có thể thực hiện việc này bằng cách sử dụng câu lệnh $ErrorActionPreference = "Stop"
khi bắt đầu tập lệnh.
Cài đặt mặc định là $ErrorActionPreference
là Continue
, đó là lý do tại sao bạn thấy tập lệnh của mình tiếp tục xảy ra sau khi xảy ra lỗi.
Điều này không ảnh hưởng đến các chương trình, chỉ các lệnh ghép ngắn. – Joey
Đáng buồn thay, due to buggy cmdlets like New-RegKey and Clear-Disk, không có câu trả lời nào trong số này là đủ. Tôi hiện đang giải quyết trên các dòng sau ở trên cùng của bất kỳ kịch bản PowerShell để duy trì sự tỉnh táo của tôi.
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$PSDefaultParameterValues['*:ErrorAction']='Stop'
và sau đó bất kỳ cuộc gọi có nguồn gốc được điều trị này:
native_call.exe
$native_call_success = $?
if (-not $native_call_success)
{
throw 'error making native call'
}
Đó mẫu gọi bản địa đang dần trở nên phổ biến đủ cho tôi rằng tôi có lẽ nên xem xét các tùy chọn để làm cho nó ngắn gọn hơn. Tôi vẫn là một newbie của powerhell, vì vậy đề xuất được hoan nghênh.
Tôi đến đây để tìm kiếm điều tương tự. $ ErrorActionPreference = "Stop" giết chết shell của tôi ngay lập tức khi tôi muốn nhìn thấy thông báo lỗi (tạm dừng) trước khi nó kết thúc. Rơi trở lại vào sự nhạy cảm lô của tôi:
IF %ERRORLEVEL% NEQ 0 pause & GOTO EOF
tôi thấy rằng điều này làm việc khá nhiều như nhau đối với kịch bản ps1 đặc biệt của tôi:
Import-PSSession $Session
If ($? -ne "True") {Pause; Exit}
Bạn cần lỗi hơi khác nhau xử lý cho các chức năng PowerShell và cho gọi exe của, và bạn cần phải chắc chắn thông báo cho người gọi biết rằng tập lệnh của bạn đã bị lỗi. Xây dựng trên đầu trang của Exec
từ thư viện Psake, một tập lệnh có cấu trúc bên dưới sẽ dừng trên tất cả các lỗi và có thể sử dụng làm mẫu cơ sở cho hầu hết các tập lệnh.
Set-StrictMode -Version latest
$ErrorActionPreference = "Stop"
# Taken from psake https://github.com/psake/psake
<#
.SYNOPSIS
This is a helper function that runs a scriptblock and checks the PS variable $lastexitcode
to see if an error occcured. If an error is detected then an exception is thrown.
This function allows you to run command-line programs without having to
explicitly check the $lastexitcode variable.
.EXAMPLE
exec { svn info $repository_trunk } "Error executing SVN. Please verify SVN command-line client is installed"
#>
function Exec
{
[CmdletBinding()]
param(
[Parameter(Position=0,Mandatory=1)][scriptblock]$cmd,
[Parameter(Position=1,Mandatory=0)][string]$errorMessage = ("Error executing command {0}" -f $cmd)
)
& $cmd
if ($lastexitcode -ne 0) {
throw ("Exec: " + $errorMessage)
}
}
Try {
# Put all your stuff inside here!
# powershell functions called as normal and try..catch reports errors
New-Object System.Net.WebClient
# call exe's and check their exit code using Exec
Exec { setup.exe }
} Catch {
# tell the caller it has all gone wrong
$host.SetShouldExit(-1)
throw
}
- 1. Dừng về lỗi đầu tiên
- 2. Làm cách nào để chạy tập lệnh PowerShell?
- 3. Dừng xác thực trên cờ lỗi đầu tiên trong Symfony2?
- 4. "bắt đầu trước mục tiêu đầu tiên. Dừng lại". lỗi
- 5. Làm cách nào để kiểm tra junit dừng sau lần kiểm tra lỗi đầu tiên
- 6. Làm cách nào để dừng tập lệnh zsh bị treo (đầu ra tty)
- 7. Gửi email nếu tập lệnh PowerShell gặp bất kỳ lỗi nào và chấm dứt tập lệnh
- 8. Làm cách nào để dừng EF (Mã đầu tiên) Kiểm tra các thay đổi lược đồ
- 9. Làm cách nào để NetBeans không dừng ở dòng đầu tiên với xdebug?
- 10. VS2010 - Cách tự động dừng biên dịch trên lỗi biên dịch đầu tiên
- 11. Làm cách nào để truyền các tham số cần thiết cho tập lệnh trong Powershell ISE?
- 12. Có cách nào để kiểm tra xem tập lệnh có đang chạy bởi PowerShell ISE không?
- 13. Làm cách nào để chuyển nhiều tham số chuỗi cho tập lệnh PowerShell?
- 14. Trình biên dịch gcc không dừng lại trên lỗi đầu tiên
- 15. Tôi làm cách nào để gỡ lỗi tập lệnh Perl?
- 16. Lỗi khi chạy Lệnh PowerShell trên Azure WorkerRole
- 17. Cách khởi chạy tập lệnh PowerShell từ dòng lệnh OS?
- 18. PowerShell: cách đầu ra lệnh grep?
- 19. Tôi làm cách nào để chạy tập lệnh 'R' mà không làm giảm đầu ra?
- 20. Làm cách nào để PowerShell giữ cửa sổ lệnh mở?
- 21. Làm cách nào để nhập lệnh ghép ngắn PowerShell mới?
- 22. trong khi grep nhiều tệp, làm thế nào để dừng sau khi kết hợp đầu tiên?
- 23. Có cách nào để làm cho SAS dừng lại khi cảnh báo hoặc lỗi đầu tiên không?
- 24. Làm cách nào để yêu cầu Boost.Test dừng lại trong trường hợp kiểm tra lỗi đầu tiên?
- 25. Đảm bảo tập lệnh Javascript đầu tiên được chạy?
- 26. Chạy tập lệnh PowerShell trên PC từ xa
- 27. GNU làm cho sản lượng "lệnh bắt đầu trước mục tiêu đầu tiên" lỗi
- 28. Làm cách nào để giới thiệu tệp cấu hình cho tập lệnh Powershell?
- 29. Làm cách nào để ngăn chặn "Dừng chạy tập lệnh này" trong trình duyệt?
- 30. Powershell: Làm thế nào tôi có thể ngừng hiển thị lỗi trong tập lệnh?
'$ ErrorActionPreference =" Stop "' có hoạt động cho các chương trình được xử lý tốt (trả về 0 thành công) không? –
Không, nó hoàn toàn không hoạt động đối với EXE. Nó chỉ hoạt động cho các lệnh ghép ngắn PowerShell chạy trong tiến trình. Đó là loại đau nhưng bạn phải kiểm tra $ LastExitCode sau mỗi lần gọi EXE, kiểm tra xem mã thoát dự kiến và nếu thử nghiệm đó cho biết lỗi, bạn phải ném để chấm dứt thực thi tập lệnh, ví dụ: 'ném '$ exe không thành công với mã thoát $ LastExitCode" 'trong đó $ exe chỉ là đường dẫn đến EXE. –
Được chấp nhận vì nó bao gồm thông tin về cách làm cho nó hoạt động với các chương trình bên ngoài. –