Ищу файл во всех папках.
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
cd V:\MyFolder
, за которым следует ls -r -inc CopyForBuild.bat
- person Orion Edwards; 15.08.2014
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
- person Andrew; 04.11.2017
*
) в конец имени файла. ****** СТРОКА1: $File = "Microsoft.OData.Core.NetFX35.V7*"
СТРОКА2: $Folder = "C:\Program Files"
СТРОКА3: Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
- person SherlockSpreadsheets; 29.04.2019
filter
и inc
объясняется здесь. -fo
может быть force
. %
- это псевдоним для foreach-object
- person Timo; 08.07.2020
Я использую это для поиска файлов, а затем заставляю 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}
При поиске папок, в которых вы можете получить ошибку, связанную с безопасностью (например, C:\Users
), используйте следующую команду:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Также будет работать
Вот метод, который я наконец придумал после борьбы:
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
не имеет стенографииПопробуй это:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
для исключения папок
- person Gargravarr; 17.06.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' }
'\ACopyForBuild\.(bat|cmd)\Z'
?
- person E. Sundin; 18.03.2019
Чтобы добавить к @ user3303020 ответ и вывести результаты поиска в файл, вы можете запустить
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat > path_to_results_filename.txt
Так будет проще найти нужный файл.
для поиска всех файлов с расширением py, начиная с / введите: dir -r * .py или dir * .py -r