无法从Exchange cmdlet捕获/重定向警告

时间:2019-01-30 18:51:33

标签: powershell

我正在尝试通过以下方式使用Set-DistributionGroup Exchange cmdlet:

$Exch_Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $ExchangeURI -Authentication Kerberos
Import-PSSession $Exch_Session -commandname Set-DistributionGroup -AllowClobber

if (<condition>) {
    try {
        Set-DistributionGroup @Setparams
    }
    catch {
        <error capture code here...>
    }
}

关于成功和失败,一切都按预期进行...但是在测试运行期间,尝试将PrimarySMTPAddress更改为无效值时,我收到警告(不是错误),该新电子邮件地址不符合电子邮件地址策略,因此不会更改。但是由于这是一个警告,所以try / catch不会触发,并且整个过程会错误地成功完成。

我尝试过:

  1. 在命令中添加-WarningAction Stop并触发try / catch,但是错误过于笼统:
      

    由于首选项变量“ WarningPreference”或公共参数设置为“停止”,因此命令执行停止。

  2. 因此,我尝试将警告捕获到变量以及文件中(以在以后报告成功或失败时进行检查),但是我尝试捕获的所有方法均失败了,即使它不断向计算机显示警告。屏幕。

    Set-Distributiongroup @Setparams -WarningVariable cmd_warn
    Set-Distributiongroup @Setparams 3> c:\temp\warnings.txt
    ...
    $command = "Set-Distributiongroup @Setparams"
    iex $command 3> c:\temp\warnings.txt
    

    但是文件和变量始终为空,我在做什么错还是错过了?

1 个答案:

答案 0 :(得分:4)

您声明您正在使用 Import-PSSession ,它会创建一个具有 proxy函数的(内存中)模块,该模块透明地调用以下命令。在远程计算机上的相同名称,称为“ 隐式远程处理 ”。

不幸的是,从Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.4开始,此功能的实现在首选项变量,通用参数和输出流。

在您的特定情况下,请尝试以下解决方法

Invoke-Command { Set-Distributiongroup @Setparams } -WarningVariable cmd_warn
if ($cmd_warn) { ... } # warning was emitted

请注意,此处的Invoke-Command调用本身并不执行远程处理;仅仅是一个 local 调用包装器,当将-WarningVariable公用参数应用于 it 时,该参数就起作用。