使用PowerShell进行递归文件搜索

时间:2011-12-30 08:34:50

标签: powershell powershell-v2.0

我在所有文件夹中搜索文件。

Copyforbuild.bat在许多地方都可用,我想以递归方式搜索。

$File = "V:\Myfolder\**\*.CopyForbuild.bat"

我如何在PowerShell中执行此操作?

9 个答案:

答案 0 :(得分:343)

Get-ChildItem cmdlet与-Recurse开关一起使用:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

答案 1 :(得分:29)

搜索可能因安全性而导致错误的文件夹(例如C:\Users)时,请使用以下命令:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

答案 2 :(得分:28)

我用它来查找文件然后让PowerShell显示结果的整个路径:

dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}

您始终可以在*和/或FolderName中使用通配符FileName.fileExtension。例如:

dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}

以上示例将搜索C:\驱动器中以Folder开头的任何文件夹。因此,如果您有一个名为FolderFooFolderBar的文件夹,PowerShell将显示这两个文件夹的结果。

文件名和文件扩展名也一样。如果您要搜索具有特定扩展名的文件,但不知道该文件的名称,则可以使用:

dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}

反之亦然:

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}

答案 3 :(得分:11)

Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

也会起作用

答案 4 :(得分:5)

试试这个:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}

答案 5 :(得分:5)

使用通配符过滤:

Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse

使用正则表达式过滤:

Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }

答案 6 :(得分:0)

这是我奋斗后终于想出的方法:

Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*

要使输出更整洁(仅路径),请使用:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname

要仅获取第一个结果,请使用:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1

现在重要的东西:

要仅搜索文件/目录,请使用-File-Directory(请参见下面的原因)。而是将其用于文件:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

,然后删除目录的-eq $false不要留下诸如bin/*之类的结尾通配符。

为什么不使用内置开关?它们很糟糕,会随机删除功能。例如,为了对文件使用-Include,必须使用通配符结束路径。但是,这会禁用-Recurse开关,而不会告诉您:

Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib

您认为这将为您提供所有子目录中的所有*.lib,但是它只会搜索bin的顶层。

要搜索目录,可以使用-Directory,但是必须删除结尾的通配符。无论出于何种原因,这都不会停用-Recurse。出于这些原因,我建议不要使用内置标志。

您可以大大缩短此命令:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

成为

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
  • Get-ChildItem的别名为gci
  • -Path默认位置为0,因此您只需输入第一个参数路径
  • -Recurse的别名为-s
  • -Include没有简写
  • 在名称/路径中的空格中使用单引号,以便可以在整个命令中用双引号引起来并在命令提示符中使用它。相反(用单引号引起来)会导致错误

答案 7 :(得分:0)

要添加到@ user3303020答案并将搜索结果输出到文件中,可以运行

Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat > path_to_results_filename.txt

以这种方式搜索正确的文件可能会更容易。

答案 8 :(得分:0)

搜索所有带有 ext "py" 的文件,从 / 类型开始:dir -r *.py 或 dir *.py -r