PowerShell 错误处理
最后修改:2025 年 2 月 15 日
有效的错误处理可确保脚本优雅地失败并提供有意义的反馈。PowerShell 提供了多种机制来处理脚本执行期间的异常和错误。
终止性错误会停止执行,而非终止性错误则允许脚本继续。在 PowerShell 中,可以使用 try/catch 块、$Error 变量和 ErrorAction 来管理不同类型的错误。
Try/Catch 块
基本的异常处理使用 try/catch 块来捕获终止性错误。此示例尝试读取一个不存在的文件。
try {
Get-Content "missing.txt" -ErrorAction Stop
}
catch {
Write-Output "Error encountered: $_"
}
该脚本使用 -ErrorAction Stop 强制生成终止性错误。catch 块使用 $_ 自动变量捕获异常。
Get-Content "missing.txt" -ErrorAction Stop
文件未找到时强制生成终止性错误。如果没有 -ErrorAction Stop,Get-Content 会产生一个非终止性错误。
PS C:\> .\try_catch.ps1 Error encountered: Cannot find path 'C:\missing.txt'...
ErrorAction 参数
使用 -ErrorAction 控制错误行为。这会将非终止性错误转换为终止性错误,以便在 try/catch 块中捕获。
try {
Remove-Item "nonexistent.txt" -ErrorAction Stop
}
catch [System.Management.Automation.ItemNotFoundException] {
Write-Output "Specific error: File not found"
}
catch {
Write-Output "General error: $_"
}
此脚本首先处理特定的异常类型,然后处理通用错误。ItemNotFoundException 专门捕获文件丢失场景。
PS C:\> .\error_action.ps1 Specific error: File not found
$Error 变量
PowerShell 维护着一个包含最近错误的 $Error 数组。使用 $Error[0] 访问最新错误。
Get-ChildItem "invalid_path" -ErrorAction SilentlyContinue
if ($Error.Count -gt 0) {
Write-Output "Last error: $($Error[0].Exception.Message)"
}
SilentlyContinue 会抑制错误输出,但仍会填充 $Error。我们检查错误并显示最新消息。
PS C:\> .\error_var.ps1 Last error: Cannot find path 'C:\invalid_path'...
Finally 块
使用 finally 块,无论是否发生错误,都可以执行清理代码。此示例演示了文件操作后的资源清理。
$file = $null
try {
$file = [System.IO.File]::OpenRead("test.txt")
}
catch {
Write-Output "Error opening file: $_"
}
finally {
if ($file) { $file.Close() }
Write-Output "Cleanup completed"
}
finally 块确保即使在文件打开过程中发生错误,文件句柄也会被关闭。
PS C:\> .\finally_block.ps1 Cleanup completed
自定义错误
使用 Write-Error 生成自定义错误并在脚本中处理它们。这允许控制错误传播。
function Test-Value {
param($val)
if ($val -lt 10) {
Write-Error "Value too low" -ErrorAction Stop
}
}
try {
Test-Value -val 5
}
catch {
Write-Output "Custom error caught: $_"
}
使用 -ErrorAction Stop 的 Write-Error 会创建一个由 catch 块捕获的终止性错误。这可以实现结构化的错误报告。
PS C:\> .\custom_error.ps1 Custom error caught: Value too low
来源
这些示例演示了创建健壮的 PowerShell 脚本所需的基本错误处理技术。
作者
列出 所有 PowerShell 教程。