Сценарий PowerShell для поиска номера и, если он больше, чем отправка электронной почты - PullRequest
0 голосов
/ 18 мая 2018

Я ищу скрипт, который запускает команду, читает вывод и затем, если число больше ... отправляет электронное письмо.

Это код, который у меня пока есть -

$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

Строка, на которой я сосредоточен, находится в очереди, за этим номером следует много пробелов.

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Ваш код ожидает завершения задания перед запуском - вы уверены, что есть выход для командлета select-string во время его выполнения? Возможно, попробуйте заменить это вместо:

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
}

Я подозреваю, что при запуске командлета данных просто нет, так как регулярное выражение, результирующие члены и вызываемые методы работают нормально, если вы проверяете файл с этими данными.

Если данных просто нет, замените это:

.\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]
0 голосов
/ 18 мая 2018

Вам нужно исправить строку кода, используя совпадения вместо совпадения:

(Select-String -Pattern "Queued:\s+(\d+)" -Path $Output).Matches.Groups[1].Value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...