PowerShell脚本,用于查找数字,如果大于,则发送电子邮件
我正在寻找一个脚本,运行命令,读取输出,然后如果一个数字大于…发送电子邮件 这是我目前掌握的代码-PowerShell脚本,用于查找数字,如果大于,则发送电子邮件,powershell,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+)
$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
我关注的行已排队,该数字后面有大量空格。您需要使用匹配项而不是匹配项来修复代码行:
(Select-String -Pattern "Queued:\s+(\d+)" -Path $Output).Matches.Groups[1].Value
您的代码是否在运行前等待作业完成-是否确实在运行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运行时,数据根本不存在,因为如果您针对包含该数据的文件进行测试,那么regex、结果成员和调用的方法都可以正常工作
如果数据根本不存在,请替换以下内容:
.\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]
我对PowerShell不太熟悉,但根据我见过的其他正则表达式,括号似乎用于指定组。因此,由于使用了模式“
排队:\s+(\d+)
”,结果集中似乎只有一个组,对应于\d+
。记住这一点,你应该选择Groups[0]
,而不是Groups[1]
。。。您的错误消息指出组
数组是“空数组”。所以这比我第一次猜测的还要简单。找不到您的模式,因此不存在组
。模式错误或输入字符串错误。无论哪种方式,在尝试索引到组之前,您可能应该添加一个条件来检查组是否为空。我应该如何做?我知道模式已满足,但命令仍不起作用。根据读取的输出,模式和regex cmd看起来正常吗?如上所述,我在这里输入时使用了匹配项,只是一个输入错误。相同错误$Queued=(选择字符串-模式“Queued:\s+(\d+)”-路径$Output)。匹配.Groups[1]。值
返回`无法索引到空数组中。在第6行,char:83+$Queued=(选择字符串-模式“Queued:\s+(\d+)”-路径$Output)。匹配。组[@AB2112$Queued
看起来是字符串而不是整数。[int]$queued-gt 100
可能会出现更好的名称错误…我认为这与表达式命令有关。请考虑命令bpdbjobs的输出。是否可以尝试将输出信息保存在文本文件中,然后运行Select String cmdlet检查错误是否相同?
$Queued = (Select-String -Pattern "Queued:\s+(\d+)" -Path $Output).Line.Split(" ")[-1]