我正在尝试在文本文件中搜索特定字符串并输出该行及其上下文:
$StateCheck = Select-String -Path C:\ImageManagerTool\Results.txt -Pattern "State:*"
$SValueCheck = Select-String -Path C:\ImageManagerTool\Results.txt -Pattern "State Value:*"
If(Get-Content C:\ImageManagerTool\Results.txt | %{$StateCheck -notmatch "State: Active"})
{
Get-Content C:\ImageManagerTool\Results.txt | Select-String -Pattern "State:*"-Context 2,7| Select-String -Pattern "State: Active" -NotMatch |Select-String -Pattern "State Value:*" -NotMatch
}
If(Get-Content C:\ImageManagerTool\Results.txt | %{$SValueCheck -notmatch "State Value: 0"})
{
Get-Content C:\ImageManagerTool\Results.txt | Select-String -Pattern "State Value:*"-Context 3,6| Select-String -Pattern "State Value: 0" -NotMatch
}
以上脚本的结果:
到目前为止,我所能完成的只是输出我想要查找的字符串实例,而不是它们的上下文。使用当前设置的'if'语句来过滤不匹配的字符串的数据,我还没想到在这种情况下使用参数-context是否有效,因为-context在接收Select时无效 - 字符串命令。在PowerShell站点上阅读Microsoft对-Context的描述时,它声明上下文存储为对象的context属性中的字符串数组。有没有办法可以重写我的脚本片段以获得所需的效果(即一个开关?)或者使用context参数作为输出其数据的属性?
答案 0 :(得分:1)
您的if
语句完全没有必要 - Select-String
如果没有与您提供的模式匹配,则不会返回任何内容。
对于第二个正则表达式匹配,您可以使用Where-Object
检查匹配的行,而不是链接Select-String
:
Select-String -Path C:\ImageManagerTool\Results.txt -Pattern "State:*"-Context 2,7|Where-Object {$_.Line -notmatch "State: Active" -and $_.Line -notmatch "State Value:*"}
第二个示例可以进一步简化,只需确保State Value:
之后的任何内容都不是0
- 您可以使用这样的否定字符集[^0]
:
Select-String -Path C:\ImageManagerTool\Results.txt -Pattern "State Value: [^0]" -Context 3,6