如何在多个文件中searchstring并返回Powershell中文件的名称?

我几天前开始学习PowerShell,在Google上找不到任何我需要的东西,请耐心等待我的问题。

我被要求将一些文本stringreplace成在Windows上运行的Jboss应用程序。 我不一定知道可能的目标文件的扩展名,也不知道它们的位置。 到目前为止,我设法recursion浏览到目录( get-ChildItem -recurse ),并find我正在寻找与get-content和select-stringstring:

 Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" 

问题是,我可以看到我正在寻找的文本的发生,但我不知道如何告诉PS返回path和每个匹配的文件的名称以及。

我如何获得包含我正在查找的expression式的文件的名称和位置?

这应该给包含你的模式的文件的位置:

 Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name 

这里有各种准确的答案,但这里是几个不同变化的最简洁的代码。 对于每个变体,顶行显示完整的语法,底部显示简洁的语法。

项目(2)是Jon Z和Manojlds的答案的一个更简洁的forms,而项目(1)相当于vikas368和buygrush的答案。

  1. 列出包含模式的所有文件的FileInfo对象:

     Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet } ls -r filespec | ? { sls pattern $_ -q } 
  2. 列出包含模式的所有文件的文件名称

     Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path ls -r filespec | sls pattern | select -u Path 
  3. 列出包含模式的所有文件的FileInfo对象:

     Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) } ls -r filespec | ? { !(sls pattern $_ -q) } 
  4. 列出包含模式的所有文件的文件名

     (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName 

pipe你的内容

 Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" 

fl *

您将看到path已经作为对象的属性返回。

如果您只想要path,请使用select pathselect -unique path以删除重复项:

 Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path 
 Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"} 

这会给你所有文件的全部细节

要保留完整的文件详细信息在结果数组中,您可以对vikas368发布的答案稍作修改(对于ISE自动完成似乎不起作用):

 Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" } 

或简而言之:

 ls -r | ?{ $_ | Select-String -Pattern "dummy" } 

这将显示path,文件名和find的匹配模式的内容行。

 Get-ChildItem -Path d:\applications\*config -recurse | Select-String -Pattern "dummy" 

如果你search到一个目录,你可以这样做:

 select-string -Path "c:\temp\*.*" -Pattern "result" -List | select Path 

这将显示每个包含searchstring的文件的完整path列表:

 foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path} 

请注意,它不会在结果上方显示标题,也不会显示包含searchstring的文本行。 它告诉你的是在哪里可以find包含string的文件。

这就是我要做的,你不需要获得内容:

 ls -r | Select-String dummy | select line,path 

要么

 ls -r | Select-String dummy | fl 

看看不同的属性是…