ChatGPT解决这个技术问题 Extra ChatGPT

如何在多个文件中搜索字符串并在 Powershell 中返回文件名?

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

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

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

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

如何获取包含我要查找的表达式的文件的名称和位置?

也许将问题编辑为更通用。这个问题的答案似乎与 JBoss 或您正在处理的应用程序无关......
我刚刚发现您的评论并编辑了我的问题……2年后!迟到总比不到好..:)

J
Jacob Bundgaard

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

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

如果您还想移动这些文件怎么办?...我收到一个错误,我无法加入 |将项目移动到末尾。
Move-Item 没有 name 参数。尝试添加 | %{Move-Item $_.name <destination>}
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path 仅返回每个文件的第一个匹配项,因此可能效率更高,并且无需对它们进行分组
值得注意的是,如果您改用 Get-ChildItem -Recurse -Filter *.txt,您只能过滤特定的文件类型,例如 txt 文件
@rud3y 如果您正在执行此类大型操作,我强烈建议您使用 foreach 循环将其写在脚本中。当你试图在一条线上完成所有这些时,它变得非常复杂,而且很容易犯大错。我根据经验说话
K
KyleMit

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

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

列出包含模式的所有文件的 FileInfo 对象:Get-ChildItem -Recurse filespec | Where-Object { 选择字符串模式 $_ -Quiet } ls -r filespec | ? { sls pattern $_ -q } 列出包含模式的所有文件的文件名:Get-ChildItem -Recurse filespec |选择字符串模式 |选择对象-唯一路径 ls -r filespec | sls 模式 |为所有不包含模式的文件选择 -u 路径列表 FileInfo 对象:Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) } ls -r filespec | ? { !(sls pattern $_ -q) } 列出所有不包含模式的文件的文件名:(Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName (ls -r 文件规范 | ? { !(sls 模式 $_ -q) }).FullName


此外,如果您只是在任何地方寻找包含该模式的文件,您可以使用 Select-String-List 参数找到第一个实例后放弃
我希望 OP 对这个问题提出了一些细微的变化,这样这就是 AA。 #1 非常有用,很明显@Michael Sorens 很喜欢 PS!
j
js2010

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

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

或者

ls -r | Select-String dummy | fl *

要查看不同的属性是什么...

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

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

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

+1,这非常适合我的情况,但是使用 select Pattern, LineNumber, Filename 以获得更简洁的输出。 Line 返回包含您的模式字符串的行上的所有内容。如果您愿意,您也可以轻松地将其输出到 csv。
这应该是选定的答案。就我而言,它快了大约 4-5 倍。当您必须对许多文件重复该命令 600 次时,这会产生很大的不同。
select Path, LineNumber, Line 更简洁。模式是多余的,因为您已经知道它是什么
j
josliber

这将显示与该模式匹配的路径、文件名和内容行。

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

如果只能在结果之间添加一行:)
m
manojlds

管道传输您的内容

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

fl *

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

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

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path

感谢你们俩,这正是我正在寻找的。不幸的是,当路径中涉及的子目录很多时,那么PS切掉绝对路径,在行尾添加三个点,如\dir1\dir2\dir3\path... 所以不知道返回的是哪个文件.有没有办法告诉 PS 对角色不那么贪婪并费心显示完整路径? :) 非常感谢 !
您需要将 -File 开关添加到 Get-ChildItem,否则您会因尝试在目录上调用 Get-Content 而导致一连串错误。
如果您需要完整路径,您可以这样做 (Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullName人们似乎忘记了 PowerShell 是面向对象的;如有疑问,请寻找房产
v
vikas368
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

这将为您提供所有文件的完整详细信息


完全不知道 -r 有效。认为你必须总是做-Recurse
R
RenoGreg

我修改了上面的答案之一,为我提供了更多信息。这让我以后再问第二个问题。是这样的:

Get-ChildItem `
        -Path "C:\data\path" -Filter "Example*.dat" -recurse | `
    Select-String -pattern "dummy" | `
    Select-Object -Property Path,LineNumber,Line | `
    Export-CSV "C:\ResultFile.csv"

我可以使用此结构指定路径和文件通配符,并将文件名、行号和相关行保存到输出文件中。


凉爽的!感谢您提供此附加解决方案:) 但是,您能否链接到您的解决方案所基于的答案并命名该答案的作者以给予信任?谢谢!
s
swalex

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

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

或简而言之:

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

E
Esperento57

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

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

L
Little Girl

这将显示包含搜索字符串的每个文件的完整路径列表:

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

请注意,它不会在结果上方显示标题,也不会显示包含搜索字符串的文本行。它只告诉您在哪里可以找到包含该字符串的文件。


知道如何显示找到模式的行号以及文件名吗?
J
Julien Calcada

使用 PowerShell,转到文件所在的路径,然后键入此命令并替换 ENTER THE STRING YOU SEARCH HERE(但保留双引号):

findstr /S /I /M /C:"ENTER THE STRING YOU SEARCH HERE" *.*

祝你有美好的一天🙂