PowerShell ForEach-Object循环中如何仅提取单次匹配的目标字符串
PowerShell 文本段落匹配提取解决方案
现有代码的核心问题是在if分支中调用Select-String时使用了全局的$content变量,会提取整个文件所有匹配的行,而非当前遍历到的单个段落的匹配值,仅需要把匹配范围限定在当前段落$_内即可解决问题。
修正后可直接达到预期输出的代码
# 按next作为分隔符读取每条规则为独立段落 $content = Get-Content C:\firewallrules.txt -Delimiter 'next' $content | ForEach-Object { # 仅对当前遍历的单个段落执行匹配提取 $matchResult = $_ | Select-String -Pattern 'ips-sensor\s+.*' if ($matchResult) { "Value Found = " + $matchResult.Matches.Value } else { "Value Not Found" } }
无需遍历段落判断的简化写法
如果你不需要输出Value Not Found的提示,仅需要提取所有匹配的目标行,可以直接全局匹配,不需要拆分段落遍历,执行效率更高:
Get-Content C:\firewallrules.txt | Select-String -Pattern 'ips-sensor\s+.*' | ForEach-Object { "Value Found = " + $_.Matches.Value }
内容的提问来源于stack exchange,提问作者wineconqueso
相关产品推荐
相关产品推荐

