Рекурсивный поиск файлов с помощью PowerShell - PullRequest
217 голосов
/ 30 декабря 2011

Я ищу файл во всех папках.

Copyforbuild.bat доступен во многих местах, и я хотел бы искать рекурсивно.

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

Как мне это сделать в PowerShell?

Ответы [ 7 ]

356 голосов
/ 30 декабря 2011

Используйте командлет Get-ChildItem с переключателем -Recurse:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
29 голосов
/ 24 января 2017

Я использую это для поиска файлов, а затем PowerShell отображает полный путь к результатам:

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

Вы всегда можете использовать подстановочный знак * в FolderName и / или FileName.fileExtension. Например:

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

Приведенный выше пример будет искать любую папку на диске C:\, начинающуюся со слова Folder. Так что если у вас есть папка с именем FolderFoo и FolderBar PowerShell покажет результаты из обеих этих папок.

То же самое относится к имени файла и расширению файла. Если вы хотите найти файл с определенным расширением, но не знаете имя файла, вы можете использовать:

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

Или наоборот:

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
29 голосов
/ 28 сентября 2015

При поиске папок, в которых может возникнуть ошибка по соображениям безопасности (например, C:\Users), используйте следующую команду:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
11 голосов
/ 26 августа 2015
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

Также будет работать

5 голосов
/ 28 июля 2016

Фильтр с использованием подстановочных знаков:

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' }
5 голосов
/ 08 ноября 2014

Попробуйте это:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
0 голосов
/ 30 мая 2019

Вот метод, который я наконец-то придумал после борьбы:

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 s во всех подкаталогах, но он будет искать только верхний уровень 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 не имеет сокращения
  • Используйте одинарные кавычки для пробелов в именах / путях, чтобы вы могли заключить всю команду в двойные кавычки и использовать ее в командной строке.Если сделать это наоборот (заключить в одинарные кавычки), вы получите ошибки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...