使用PowerShell进行递归文件搜索

Sam*_*abu 228 powershell powershell-2.0

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

Copyforbuild.bat 很多地方都有,我想递归搜索.

$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Run Code Online (Sandbox Code Playgroud)

我怎么能在PowerShell中做到这一点?

Sha*_*evy 374

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

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
Run Code Online (Sandbox Code Playgroud)

  • 做一个完全相同的事情的简短方法:`cd V:\ MyFolder`后跟`ls -r -inc CopyForBuild.bat` (21认同)
  • 尝试将ErrorAction参数设置为Continue或SilentlyContinue(如果其值不是如上所述). (6认同)
  • 那么上述评论者的意思是......`ls -r -ea silentlycontinue -fo -inc"filename.txt"| %{$ _.fullname}` (5认同)
  • 似乎有一个问题,如果它运行到您无权访问的目录,则整个搜索将因进程退出而中止。有办法解决这个问题吗? (2认同)
  • 添加到评论:[此处]解释了“filter”和“inc”之间的差异(/sf/answers/2002253851/)。`-fo` 可以是 `force`。`%` 是 `foreach-object` 的别名 (2认同)

Bin*_*e01 32

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

dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}
Run Code Online (Sandbox Code Playgroud)

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

dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}
Run Code Online (Sandbox Code Playgroud)

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

文件名和文件扩展名也是如此.如果要搜索具有特定扩展名的文件,但不知道文件名,可以使用:

dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}
Run Code Online (Sandbox Code Playgroud)

或相反亦然:

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个答案非常有用,因为它解决了一个特定的用例 - 实际上想要使用你正在寻找的文件.| 给你的文件的全名是其他答案中缺少的东西. (4认同)
  • 我必须在这里同意@Sanity1123,如果您确实想使用该文件,则需要该文件的完整路径。恕我直言,这应该是公认的答案。 (2认同)

Möt*_*ötz 31

在根据安全性(例如C:\Users)搜索可能出现错误的文件夹时,请使用以下命令:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
Run Code Online (Sandbox Code Playgroud)


use*_*020 12

Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Run Code Online (Sandbox Code Playgroud)

也会工作


Asa*_*han 11

这是我在挣扎之后终于想出的方法:

Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
Run Code Online (Sandbox Code Playgroud)

要使输出更清晰(仅路径),请使用:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname
Run Code Online (Sandbox Code Playgroud)

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

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

现在是重要的东西:

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

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
Run Code Online (Sandbox Code Playgroud)

并删除-eq $falsefor 目录。千万不能让像一个尾随通配符bin/*

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

Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Run Code Online (Sandbox Code Playgroud)

你会认为这会给你所有*.lib子目录中的所有s,但它只会搜索bin.

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

您可以大大缩短此命令:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
Run Code Online (Sandbox Code Playgroud)

变成

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
Run Code Online (Sandbox Code Playgroud)
  • Get-ChildItem 别名为 gci
  • -Path 默认为位置 0,因此您可以创建第一个参数路径
  • -Recurse 别名为 -s
  • -Include 没有速记
  • 对名称/路径中的空格使用单引号,以便您可以用双引号将整个命令括起来并在命令提示符中使用它。反过来做(用单引号括起来)会导致错误


小智 6

尝试这个:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用`| Where-Object {!$ _ PSIsContainer}`排除文件夹 (2认同)

Mov*_*GP0 5

使用通配符过滤:

Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse
Run Code Online (Sandbox Code Playgroud)

使用正则表达式过滤:

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