Powershell:如何使用-match来严格匹配条件,然后仅在输出时发送电子邮件

问题描述 投票:0回答:1

所以我试图根据必须同时满足的两个条件来过滤文本文件。

我想检查一下它检查 2 个条件并且两者都必须匹配的语法是什么。

(Get-Content -Path textfile.txt) -match ‘condition1’ -and ‘condition2’ | Set-Content output.txt

我尝试了上面的代码以及其他解决方案,例如 select-string ,但它是一个或条件,而不是严格匹配这两个条件

这是我的最终代码

$boolean = Get-Content -Path 'C:\test.txt' | Where-Object { $_ -match 'condition1' -and $_ -match 'condition2' | Set-Content -Path 'C:\output.txt'
$renamefile = Rename-Item -Path "C:\output.txt" -NewName "server.txt"

If ($boolean)
{ 
Send-MailMessage -From -To -Subject -Body -SmtpServer -Port -Attachement 'C:\output_renamedfile.txt'
echo "email sent"
}

注意:对于 send-MailMessage 参数,我已经相应地定义了它们。

只是我确信它不会进入 if 循环,因为我在那里放置了一个 echo,并且它没有 echo 到输出中。 对此有什么建议吗?该脚本每小时运行一次,文件将被重命名为 C:\server.txt,但前提是它同时匹配条件 1 和条件 2。

如果不符合任何一个条件,则不会发送电子邮件,但文件 C:\server.txt 仍然存在,然后下一小时将运行,如果本次运行匹配,它将生成输出.txt 并将其重命名为 server.txt (这是否会替换现有的 server.txt,然后发送新文件 - server.txt)?

powershell scripting
1个回答
1
投票

-and
运算符需要每一侧的完整表达式,因此您的操作应如下所示:

(Get-Content -Path textfile.txt) -match ‘condition1’ -and (Get-Content -Path textfile.txt) -match ‘condition2’

但是

-match
运算符仅返回
true
false
,因此这不会让您得到
textfile.txt
中两个条件都匹配的行(我认为这就是您想要的)。

为此,您可以使用

Where-Object
:

Get-Content -Path textfile.txt | Where-Object { $_ -match 'condition1' -and $_ -match 'condition2' }

这将返回

textfile.txt
中符合这两个条件的所有行。

另一种选择是使用

Select-String
cmdlet,但由于该 cmdlet 不允许您验证多个模式,因此您必须使用正则表达式将条件组合成一个模式,如下所示:

Get-Content -Path textfile.txt | Select-String -Pattern 'condition1.*condition2'

Select-String
cmdlet 很有用,因为它返回具有更多属性的对象,例如
LineNumber
Filename
等。但如果顺序可能颠倒或存在其他条件,则必须将其考虑在内正则表达式模式,或使用
Where-Object
方法。

© www.soinside.com 2019 - 2024. All rights reserved.