在文本文件中搜索字符串并在Powershell中输出其上下文?

时间:2018-06-18 17:08:10

标签: powershell

我正在尝试在文本文件中搜索特定字符串并输出该行及其上下文:

$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
}

以上脚本的结果:

Results of Above Script

到目前为止,我所能完成的只是输出我想要查找的字符串实例,而不是它们的上下文。使用当前设置的'if'语句来过滤不匹配的字符串的数据,我还没想到在这种情况下使用参数-context是否有效,因为-context在接收Select时无效 - 字符串命令。在PowerShell站点上阅读Microsoft对-Context的描述时,它声明上下文存储为对象的context属性中的字符串数组。有没有办法可以重写我的脚本片段以获得所需的效果(即一个开关?)或者使用context参数作为输出其数据的属性?

1 个答案:

答案 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