Я ищу файл во всех папках.
Copyforbuild.bat
доступен во многих местах, и я хотел бы искать рекурсивно.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Как я могу сделать это в PowerShell?
Я ищу файл во всех папках.
Copyforbuild.bat
доступен во многих местах, и я хотел бы искать рекурсивно.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Как я могу сделать это в PowerShell?
Используйте командлет Get-ChildItem с помощью переключателя -Recurse
:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
При поиске в папках, в которых может возникнуть ошибка по соображениям безопасности (например, C:\Users
), используйте следующую команду:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
Я использую это для поиска файлов, а затем 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}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Будет также работать
Попробуйте следующее:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
Фильтр с использованием подстановочных знаков:
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' }
Вот метод, который я наконец придумал после борьбы:
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
не содержит сокращенийЧтобы добавить к @user3303020 ответ и вывести результаты поиска в файл, вы можете запустить
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat > path_to_results_filename.txt
Может быть проще найти правильный файл таким способом.