【问题标题】:try catch wont actually catch [duplicate]尝试捕获实际上不会捕获[重复]
【发布时间】:2020-05-15 08:43:39
【问题描述】:

我有一些用户在 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")
    }
 }

这里有什么问题?

【问题讨论】:

  • Try/catch 仅用于脚本终止或命令终止错误。我会测试 $?而是。

标签: powershell error-handling


【解决方案1】:

Try-Catch 块只会捕获终止错误。您可以通过设置特殊的 ErrorPreference 或 ErrorAction 变量来做到这一点。

方法一:

此方法导致几乎每个 cmdlet 在发生错误时终止脚本执行。如果满足您的需要,您可以简单地执行此操作:

在脚本的顶部声明

$ErrorActionPreference = 'Stop'

方法二:

使用它,您可以控制不同的 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.

【讨论】:

    【解决方案2】:

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

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

    或者设置

    $ErrorActionPreference = 'Stop'
    

    在脚本的开头。

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 2020-12-16
      • 2022-06-21
      • 2014-07-16
      • 2020-12-08
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多