首页 > 解决方案 > try catch 是调用命令

问题描述

我有一个脚本块去 Dc 并尝试链接选定的 gpo 和 ou:

forEach ($line in $listBox1.selecteditems) {
    try {
        Invoke-Command -Session $s -ScriptBlock {New-GPLink -Name $using:line -Target $using:SWITCH -ErrorAction Stop | Out-Null}
        $ResultsTextBox.AppendText("`r $line HAVE BEEN LINKED Successfully.`r") 
    } catch {
        $ResultsTextBox.AppendText("`n $line IS NOT LINKED TO THIS OU`n")
    }
}

这里唯一的问题是try catch 不起作用,如果他试图链接一个已经链接的gpo - ou,我试图做的是给用户信息。但是当我运行这个块时会发生什么是用户得到输出“......已成功链接”,即使链接已经存在。我将在命令行中看到错误输出,如下所示:

The GPO named 'MSAVS-Policy1' is already linked to a Scope of Management with Path 'OU=Domain
Controllers,DC=shahar,DC=local'.
    + CategoryInfo          : InvalidArgument: (Microsoft.Group...ewGPLinkCommand:NewGPLinkCommand) [New-GPLink], Argu
   mentException
    + FullyQualifiedErrorId : UnableToCreateNewLink,Microsoft.GroupPolicy.Commands.NewGPLinkCommand
    + PSComputerName        : dc01

我在这里做错了什么?

标签: powershelltry-catchinvoke

解决方案


由于您正在New-GPLink远程执行 cmdlet,我们需要考虑 2 个级别的错误处理 - 远程脚本块内的命令引发的错误,然后是Invoke-Command.

try块对远程发生的事情是“盲目的”,并且只能捕获客户端上的错误,因此Invoke-Command还必须将抛出错误视为终止,因此还要添加参数-ErrorAction参数:

try{
  Invoke-Command {...} -ErrorAction Stop
}
catch{
  # ...
}

推荐阅读