我几天前开始学习powershell,我在谷歌上找不到任何我需要的东西,所以请忍受我的问题。

我被要求将一些文本字符串替换为多个文件。我不一定知道可能的目标文件的扩展名,我也不知道它们的位置。到目前为止,我已经成功递归地浏览到目录(get-ChildItem -recurse),并找到我正在寻找的字符串get-content和select-string:

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

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

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


当前回答

管道的内容

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

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

如果你只想要路径,使用select path或select -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"}

这将为您提供所有文件的完整细节

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

Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path

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

第(2)项是Jon Z和manojlds的答案的更简洁形式,而第(1)项相当于vikas368和buygrush的答案。

List FileInfo objects for all files containing pattern: Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet } ls -r filespec | ? { sls pattern $_ -q } List file names for all files containing pattern: Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path ls -r filespec | sls pattern | select -u Path List FileInfo objects for all files not containing pattern: Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) } ls -r filespec | ? { !(sls pattern $_ -q) } List file names for all files not containing pattern: (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName

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

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

这就是我要做的,你不需要get-content:

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

or

ls -r | Select-String dummy | fl *

看看不同的属性是什么…

这个更快。第二个参数是-filter:

ls -r . *.bat | select-string netsh

ls -r -path . -filter *.bat | select-string netsh