考虑这个简单的代码:
Read-Host $path
try {
Get-ChildItem $Path -ErrorAction Continue
}
Catch {
Write-Error "Path does not exist: $path" -ErrorAction Stop
Throw
}
Write-Output "Testing"
如果指定了无效路径,为什么'测试'会打印到shell?
脚本不会在catch块中停止。我究竟做错了什么?
答案 0 :(得分:2)
在Try Catch块中,您需要设置Get-ChildItem -ErrorAction Stop
所以异常会在Catch块中捕获。
使用continue,您指示命令在发生实际错误时不会产生终止错误。
编辑: 此外,您的throw语句在那里是无用的,您不需要为Write-Error指定错误操作。
这是修改后的代码。
$path = Read-Host
try {
Get-ChildItem $Path -ErrorAction stop
}
Catch {
Write-Error "Path does not exist: $path"
}
附加说明
您可以通过将默认操作设置为停止使用来将此默认行为(如果这是您想要的)应用于整个脚本:
$ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop
答案 1 :(得分:0)
我认为这就是你所需要的:
$path = Read-Host 'Enter a path'
try {
Get-ChildItem $Path -ErrorAction Stop
}
Catch {
Throw "Path does not exist: $path"
}
Write-Output "Testing"
Per Sage的回答,您需要在Try块中更改为-ErrorAction Stop
。这会强制Get-ChildItem
cmdlet抛出终止错误,然后触发Catch
块。默认情况下(以及Continue
ErrorAction选项)它会抛出一个非终止错误,而这个错误不会被try..catch捕获。
如果您希望代码停在Catch
块中,请将Throw
与要返回的邮件一起使用。这将产生终止错误并停止脚本(Write-Error -ErrorAction Stop
也将实现终止错误,这只是一个更复杂的方法。通常,当您想要返回非终止错误消息时,应使用Write-Error