PowerShell脚本查找数字,如果大于发送电子邮件

时间:2018-05-18 00:50:46

标签: powershell

我正在寻找一个运行命令的脚本,读取输出,然后如果数字大于...发送电子邮件。

这是我到目前为止的代码 -

$Output = 'D:\test.data\QueuedJobss.txt'
d:
set-location -Path 'D:\program files\veritas\netbackup\bin\admincmd'
.\bpdbjobs -summary -L > $Output

$Queued = (Select-String -Pattern "Queued:\s+(\d+)" -Path $Output).Matches.Groups[1].Value

if ($Queued -gt 100 ) {
  $MailArgs = @{
        'To'          = 'ab2112@test.com'
        'From'        = 'netbackup@test.com'
        'Subject'     = 'Over 100 Queued Jobs!'
        'Attachments' = $Output
        'Body'        = 'Check Environment'

        'SmtpServer' = 'smtp.us.test.com'
       }
     Send-MailMessage @MailArgs
  }

目前正在返回错误 -

}
Cannot index into a null array.
At line:6 char:81
+ $Queued = (Select-String -Pattern "Queued:\s+(\d+)" -Path $Output).Match.Groups[ <<<< 1].Value
    + CategoryInfo          : InvalidOperation: (1:Int32) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

它正在阅读的输出看起来像 -

Summary of jobs on ustestnbma01
Queued:                                1
Waiting-to-Retry:                        0
Active:                           5
Successful:                   25876
Partially Successful:           136
Failed:                         327
Incomplete:                       0
Suspended:                        0
Total:                        26345

我关注的行是Queued,这个数字后面跟着很多空格。

2 个答案:

答案 0 :(得分:1)

您的代码是否在运行之前等待作业完成 - 您确定cmdlet运行时select-string cmdlet是否有输出?也许试着用这个代替:

If (Test-Path $Output)
{
    $Queued = (Select-String -Pattern "Queued:\s+(\d+)" -Path $Output).Matches.Groups[1].Value

    If ($Queued -gt 100 )
    {
        $MailArgs = @{
            'To'          = 'ab2112@test.com'
            'From'        = 'netbackup@test.com'
            'Subject'     = 'Over 100 Queued Jobs!'
            'Attachments' = $Output
            'Body'        = 'Check Environment'

            'SmtpServer' = 'smtp.us.test.com'
        }

        Send-MailMessage @MailArgs
    }
}
Else
{
    $MailArgs = @{
        'To'          = 'ab2112@test.com'
        'From'        = 'netbackup@test.com'
        'Subject'     = 'No output found!'
       #'Attachments' = $Output
        'Body'        = 'Check Environment'

        'SmtpServer' = 'smtp.us.test.com'
    }

    Send-MailMessage @MailArgs
}

我怀疑cmdlet运行时数据根本不存在,因为正如你正在测试包含该数据的文件一样,正则表达式,结果成员和调用的方法都可以正常工作。

如果数据不存在,请替换为:

.\bpdbjobs -summary -L > $Output

有了这个:

Start-Process -FilePath .\bpdbjobs -ArgumentList "-summary","-L","> $Output" -Wait

或者,如果生成的成员和方法不起作用,您可以尝试:

$Queued = (Select-String -Pattern "Queued:\s+(\d+)" -Path $Output).Line.Split(" ")[-1]

答案 1 :(得分:0)

您需要使用匹配而不是匹配来修复代码行:

(Select-String -Pattern "Queued:\s+(\d+)" -Path $Output).Matches.Groups[1].Value