尝试捕获实际上不会捕获

时间:2020-05-15 08:43:39

标签: powershell error-handling

我有一些用户在gui脚本中选择的选定项,它们代表GPO 现在我有他想链接到的OU。 代码有效,但是我想给用户提供链接和无法链接的用户,因为它们已经链接了 但是由于某些原因,这个try catch不会这样做,因为gui输出成功的链接,并在链接已经存在的情况下写入控制台错误

$ResultsTextBox.clear()
 #$listBox1.selecteditems
 $SWITCH = Get-ADOrganizationalUnit -filter *  -Property CanonicalName | Where-Object {$_.CanonicalName -eq $listBox2.SelectedItem}

 forEach ($line in $listBox1.selecteditems){
 #Link each selected item GPO to the OU
 try {
    New-GPlink -name $line -target $SWITCH
    $ResultsTextBox.AppendText("`n GPO: $line HAVE BEEN LINKED Successfully.`n")
        }

    catch{$ResultsTextBox.AppendText("`n COULDN NOT LINK GPO: $line TO $SWITCH `n")
    }
 }

这是怎么了?

2 个答案:

答案 0 :(得分:6)

Try-Catch块将仅捕获终止错误。您可以通过设置特殊的ErrorPreference或ErrorAction变量来完成此操作。

方法1:

此方法使几乎每个cmdlet都在发生错误时终止脚本执行。只要满足您的需求,您就可以这样做:

在脚本顶部声明

$ErrorActionPreference = 'Stop'

方法2:

使用此方法,您可以控制在发生错误时不同的PowerShell cmdlet的行为,从而为您提供更多控制:

# For every cmdlet inside the try block add -ErrorAction to Stop for the try block to "catch".
New-GPlink -name $line -target $SWITCH -ErrorAction STOP

请检查about_try_catch_finally.

答案 1 :(得分:4)

向您要捕获的每个命令添加-ErrorAction Stop:

Try {
    New-GPlink -name $line -target $SWITCH -ErrorAction Stop
}
Catch {
    $_
}

或设置

$ErrorActionPreference = 'Stop'

在脚本的开头。