ZetCode

PowerShell 错误处理

最后修改:2025 年 2 月 15 日

有效的错误处理可确保脚本优雅地失败并提供有意义的反馈。PowerShell 提供了多种机制来处理脚本执行期间的异常和错误。

终止性错误会停止执行,而非终止性错误则允许脚本继续。在 PowerShell 中,可以使用 try/catch 块、$Error 变量和 ErrorAction 来管理不同类型的错误。

Try/Catch 块

基本的异常处理使用 try/catch 块来捕获终止性错误。此示例尝试读取一个不存在的文件。

try_catch.ps1
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 块中捕获。

error_action.ps1
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] 访问最新错误。

error_var.ps1
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 块,无论是否发生错误,都可以执行清理代码。此示例演示了文件操作后的资源清理。

finally_block.ps1
$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 生成自定义错误并在脚本中处理它们。这允许控制错误传播。

custom_error.ps1
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

来源

Microsoft PowerShell 文档

这些示例演示了创建健壮的 PowerShell 脚本所需的基本错误处理技术。

作者

Jan Bodnar 是一位专业的开发人员和技术作家,在系统管理和自动化方面拥有专业知识。他是多本编程手册的作者,也是专注于 PowerShell 的教育资源的维护者。

列出 所有 PowerShell 教程