【问题标题】:Recursive file search using PowerShell使用 PowerShell 进行递归文件搜索
【发布时间】:2012-01-30 10:45:11
【问题描述】:

我正在所有文件夹中搜索一个文件。

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

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

如何在 PowerShell 中执行此操作?

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

    使用Get-ChildItem cmdlet 和-Recurse 开关:

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

    【讨论】:

    • 似乎有一个问题,如果它运行到一个你没有访问权限的目录,整个搜索会因为进程退出而中止。有办法解决吗?
    • 尝试将 ErrorAction 参数设置为 Continue 或 SilentlyContinue(以防其值未如所述)。
    • 做同样事情的更短的方法:cd V:\MyFolder 后跟ls -r -inc CopyForBuild.bat
    • 以上评论者的意思是……ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
    • 添加到 cmets:filterinc 之间的差异解释为 here-fo 可以是 force%foreach-object 的别名
    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 也可以使用| Where-Object { !$_PSIsContainer }排除文件夹
    【解决方案3】:
    Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
    

    也可以

    【讨论】:

    • 而如果要将结果输出到文件中,可以在命令末尾添加`> path_to_filename.txt`。
    • 当前目录 Get-ChildItem . -name -recurse *.bat 为我工作
    【解决方案4】:

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

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

    【讨论】:

      【解决方案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' }
      

      【讨论】:

      • 不应该是'\ACopyForBuild\.(bat|cmd)\Z'吗?
      【解决方案6】:

      我用它来查找文件,然后让 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}
      

      【讨论】:

      • 我发现这个答案非常有用,因为它解决了一个特定的用例 - 实际上想要使用您正在寻找的文件。 |给你文件的全名是其他答案中缺少的东西。
      • 这里我必须同意@Sanity1123,如果您真的想使用该文件,您将需要该文件的完整路径。恕我直言,这应该是公认的答案。
      • 作为一个初学者,我很难理解管道之后发生的事情。我已经打开了a question
      • 正如其他人所说,当您需要存储返回值时,这是最好的答案。就我而言,我必须找到一个文件来删除它,这让它变得更容易了。
      【解决方案7】:

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

      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
      

      您可能认为这会给您所有子目录中的所有*.libs,但它只会搜索顶级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 没有速记
      • 对名称/路径中的空格使用单引号,以便您可以用双引号将整个命令括起来并在命令提示符中使用。反过来(用单引号括起来)会导致错误

      【讨论】:

        【解决方案8】:

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

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

        这样搜索正确的文件可能会更容易。

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-04-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-20
            • 2018-07-08
            相关资源
            最近更新 更多