错误操作不会停止脚本

时间:2017-10-06 10:42:18

标签: powershell

考虑这个简单的代码:

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块中停止。我究竟做错了什么?

2 个答案:

答案 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