powershell 选择字符串并递归到特定文件

powershell 选择字符串并递归到特定文件

我很确定 Powershell 的 select-string 可以通过一点 Get-ChildItem 递归为我工作。

我有很多这样的目录:

abc_123
abc_345
abc_567
abc_890
abc_111
abc_569

在每个目录中,都有一个特定的文件,并且每个目录中的每个文件都有相同的路径:

abc_123:\AAA\SDK\Settings\foo.settings.xml
abc_345:\AAA\SDK\Settings\foo.settings.xml
abc_567:\AAA\SDK\Settings\foo.settings.xml

等等。

在 foo.settings.xml 文件中,我想搜索“BAR.”以及其下面的一行:

  <name="BAR.ABB"
            default="1"

我遇到的问题是在包含 abc_123、abc_345、abc_567 等的目录中,还有其他目录也包含 BAR.*。我不关心这些结果。

我正在尝试做这样的事,但没有成功。

Get-ChildItem -Recurse *.* | Select-String -Pattern "BAR.*" foo.settings.xml | Select-Object -Unique Path

我可以在命令中的哪里指定我只想搜索以 abc_ 开头并位于特定路径的目录?

- - 编辑 - -

该路径始终以 abc_* 开头,并且 foo.settings.xml 始终具有以下路径: abc_*:\AAA\SDK\Settings\foo.settings.xml

我尝试了这个: Get-ChildItem -Recurse | Where-Object {"abc_*"} | Select-String –Pattern "BAR.*",但这似乎给出了与上面相同的结果。

答案1

在您的行中,Get-ChildItem -Recurse *.*您指定想要所有具有任何扩展名的文件,因为*.*绑定到-Filter参数。

获取所有文件开始使用路径 abc_* 并且始终使用相同的相对路径,您可以执行以下操作:Get-ChildItem -Recurse | Where-Object {$_.FullName -like 'abc_*:\AAA\SDK\Settings\foo.settings.xml'} | Select-String ...

但是,考虑到每个 foo.settings.xml 文件都位于同一个相对目录中,假设每个目录中有大量子目录,这似乎相对低效abc_*。在这种情况下,更好的解决方案是这样的:

(其中 $Path 是包含所有 abc_* 目录的位置的根路径)

Get-ChildItem $Path -Filter abc_* | Foreach-Object {Select-String -Path "$($_.FullName)\AAA\SDK\Settings\foo.settings.xml" -Pattern "BAR.*"}

相关内容