【问题标题】:Receive Location Autohandling false email alerts接收位置自动处理虚假电子邮件警报
【发布时间】:2016-12-18 20:13:06
【问题描述】:
$exceptionList = Get-Content C:\Users\Dipen\Desktop\Exception_List.txt

$ReceiveLocations = Get-WmiObject MSBTS_ReceiveLocation -Namespace 'root\MicrosoftBizTalkServer' -Filter '(IsDisabled = True)' |
                    Where-Object { $exceptionList -notcontains $_.Name }

# Exit the script if there are no disabled receive locations
if ($ReceiveLocations.Count -eq 0)
{
    exit
}

例子:

$mailBodyPT = ""

$mailTextReportPT = "There are: "
[STRING]$Subject = $SubjectPrefix + $BizTalkGroup
$mailTextReportPT += "in the BizTalk group: " + $BizTalkGroup + "." 

#Send mail
foreach ($to in $EmailTo) 
{
    $Body = $HTMLmessage
    #$SMTPClient = New-Object Net.Mail.SmtpClient($PSEmailServer) 
    $message = New-Object Net.Mail.MailMessage($from, $to, $Subject, $Body)
    $message.IsBodyHtml = $true;
    $SMTPClient.Send($message)
}

问题:当所有 RL 的状态为“已禁用”并且所有这些 RL 都包含在异常列表中时,变量 $ReceiveLocations 的值应该为 false,我需要在我的脚本中停止进一步处理。 (如果在异常列表中找到所有 RL,则不执行任何操作,直接退出)

但我仍然收到虚假电子邮件警报。如果在 $ReceiveLocations 中没有发现额外的 RL,我们如何设置不接收电子邮件警报的逻辑?

【问题讨论】:

    标签: powershell biztalk


    【解决方案1】:

    当您的Get-WmiObject 语句没有返回结果时,变量$ReceiveLocations 的值是$null$null 没有 Count 属性,因此检查 $ReceiveLocations.Count -eq 0 失败,并且您的脚本在发送电子邮件之前不会终止。

    您可以通过多种方式避免此问题,例如通过将$ReceiveLocations 放入array subexpression operator

    if (@($ReceiveLocations).Count -eq 0) {
        exit
    }
    

    或者您可以使用 PowerShell 解释 values in boolean expressions 的方式(非空数组变为 $true$null 变为 $false):

    if (-not $ReceiveLocations) {
        exit
    }
    

    【讨论】:

    • ++,但值得注意的是 PSv3 中引入的标量和集合的统一处理(我认为)确实允许在空值表达式上使用 .Count返回0$null.Count -eq 0 在 PSv3+ 中返回 $true,而在 PSv2- 中返回 $false
    • 我以为没有,但我刚刚验证过,你是对的。不过,如果只是出于兼容性原因,我可能仍然不想依赖它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多