首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell:如果命令输出与预期的3个字符串数组不同,则发送电子邮件

Powershell:如果命令输出与预期的3个字符串数组不同,则发送电子邮件
EN

Stack Overflow用户
提问于 2018-12-24 18:45:55
回答 3查看 301关注 0票数 2

这就是我到目前为止所得到的

如果命令放置了第四行输出,那么正则表达式就不应该匹配,但对我来说是匹配的。

有什么想法吗?

代码语言:javascript
复制
$From = "cody@tech.com"
$To = "cody@tech.com"
$Subject = "hello"
$Body = "body"
$SMTPServer = "smtp.office365.com"
$SMTPPort = "587"
$Attachment = "c:\checkpointlog.txt"

$RE = [regex]"(?smi)^Checkpointing to checkpoint.*^MD5 \(checkpoint.*^Rotating D:\\Perforce\\Server\\journal to journal.*?$"

$output = p4d -jc
$output | add-content c:\checkpointlog.txt

if ($output -notmatch $RE) { 
    $param = @{
        From        = $From
        To          = $To
        Subject     = $Subject
        Body        = $Body 
        SmtpServer  = $SMTPServer 
        port        = $SMTPPort 
        Usessl      = $True
        Credential  = $cred 
        Attachments = $Attachment
    }
    Send-MailMessage @param
    Write-Host 'unexpected value, email sent' 
    exit
}
else {
Write-Host 'continuing script' 

}

Perforce命令p4 -jc的输出应该始终类似于以下3行:

代码语言:javascript
复制
Checkpointing to checkpoint.22... 
MD5 (checkpoint.22) = F561234wer2B8E5123456767745645616D 
Rotating D:\Perforce\Server\journal to journal.21...

我想在if语句中使用regex,这样如果输出与下面的3行字符串不匹配,那么就会发送一封电子邮件和日志文件一起检查。

代码语言:javascript
复制
Checkpointing to checkpoint.*
MD5 (checkpoint.*
Rotating D:\Perforce\Server\journal to journal.*

我希望用一张外卡*来说明增加的数字

任何想法都会很棒的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-25 02:16:46

  • 您的正则表达式试图匹配多行、,因此需要一个单行E 211E 112字符串作为输入E 213
  • 捕获外部程序输出的返回字符串(行)的数组。
  • 使用字符串数组作为-match运算符的LHS将使PowerShell单独匹配每个字符串的正则表达式。

因此,p4d 将输出的行与新行连接起来,形成一个多行字符串,以便正则表达式可以匹配多行:

代码语言:javascript
复制
$output = (p4d -jc) -join "`n"

此外,如果希望确保regex与完整的输入(而不仅仅是子字符串)匹配,请按照以下方式重新构造regex:

  • 删除内联选项m (多行),以便^$只匹配多行字符串的起始和结尾。
  • 删除内联选项s,以便.不匹配换行符,并显式地使用\n (而不是^)匹配换行符。
代码语言:javascript
复制
$RE = '(?i)^Checkpointing to checkpoint.*\nMD5 \(checkpoint.*\nRotating D:\\Perforce\\Server\\journal to journal.*$'
票数 1
EN

Stack Overflow用户

发布于 2018-12-24 19:14:08

代码语言:javascript
复制
$RE = [regex]"(?smi)^Checkpointing to checkpoint.*^MD5 \(checkpoint.*^Rotating D:\\Perforce\\Server\\journal to journal.*?$"

$output = p4d -jc
$output | add-content c:\checkpointlog.txt

if ($output -notmatch $RE) { 
    $param = @{
        From        = $From
        To          = $To
        Subject     = $Subject
        Body        = $Body 
        SmtpServer  = $SMTPServer 
        port        = $SMTPPort 
        Usessl      = $True
        Credential  = $cred 
        Attachments = 'c:\checkpointlog.txt'
    }
    Send-MailMessage @param
    exit
}
票数 0
EN

Stack Overflow用户

发布于 2018-12-24 20:05:41

我知道你想使用RegEx,但也许这会有帮助吗?这可能不是最伟大的,但它应该有效。

代码语言:javascript
复制
$file='checkpointlog.txt'

$line1Expected="Checkpointing to checkpoint*"
$line2Expected="MD5 (checkpoint*"
$line3Expected="Rotating D:\Perforce\Server\journal to journal*"

$line1Actual=Get-Content($file) | Select -Index 0
$line2Actual=Get-Content($file) | Select -Index 1
$line3Actual=Get-Content($file) | Select -Index 2


if($line1Actual -like $line1Expected`
    -and $line2Actual -like $line2Expected`
    -and $line3Actual -like $line3Expected){
}else{
    echo 'send mail'
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53916836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档