Я шукаю файл у всіх папках.
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
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
) до кінця імені файла. ****** LINE1: $File = "Microsoft.OData.Core.NetFX35.V7*"
LINE2: $Folder = "C:\Program Files"
LINE3:Get-ChildItem -Path $Folder -Filter $File -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 -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
не має стенограмиСпробуйте це:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
можете виключити папки
Фільтрування за допомогою макетів:
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'
?