所以我试图根据必须同时满足的两个条件来过滤文本文件。
我想检查一下它检查 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)?
-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
方法。