我很确定 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.*"}