Szukam pliku we wszystkich folderach.
Copyforbuild.bat
jest dostępny w wielu miejscach i chciałbym szukać rekurencyjnie.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Jak mogę to zrobić w PowerShell?
Szukam pliku we wszystkich folderach.
Copyforbuild.bat
jest dostępny w wielu miejscach i chciałbym szukać rekurencyjnie.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Jak mogę to zrobić w PowerShell?
Odpowiedzi:
Użyj polecenia cmdlet Get-ChildItem z -Recurse
przełącznikiem:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
następniels -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
) na końcu nazwy pliku. ****** LINE1: $File = "Microsoft.OData.Core.NetFX35.V7*"
LINE2: $Folder = "C:\Program Files"
Line3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
Używam tego, aby znaleźć pliki, a następnie PowerShell wyświetla całą ścieżkę wyników:
dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}
Zawsze możesz użyć symbolu wieloznacznego *
w FolderName
i / lub FileName.fileExtension
. Na przykład:
dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}
Powyższy przykład przeszuka dowolny folder na C:\
dysku, zaczynając od słowa Folder
. Więc jeśli masz folder o nazwie FolderFoo
iFolderBar
PowerShell wyświetli wyniki z obu tych folderów.
To samo dotyczy nazwy i rozszerzenia pliku. Jeśli chcesz wyszukać plik z określonym rozszerzeniem, ale nie znasz nazwy pliku, możesz użyć:
dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}
Lub odwrotnie:
dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Będzie również działać
Oto metoda, którą w końcu wymyśliłem po zmaganiu:
Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
Aby wyczyścić dane wyjściowe (tylko ścieżka), użyj:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname
Aby uzyskać tylko pierwszy wynik, użyj:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1
Teraz najważniejsze rzeczy:
Aby wyszukiwać tylko pliki / katalogi, nie używaj -File
lub -Directory
(patrz poniżej dlaczego). Zamiast tego użyj tego dla plików:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
i usuń -eq $false
katalogi. Czy nie zostawić z tyłu wieloznaczny podobnego bin/*
.
Dlaczego nie skorzystać z wbudowanych przełączników? Są okropne i losowo usuwają funkcje. Na przykład, aby użyć -Include
z plikiem, musisz zakończyć ścieżkę znakiem wieloznacznym. Jednak powoduje to wyłączenie -Recurse
przełącznika bez mówienia:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Można by pomyśleć, że dałoby to wszystkie *.lib
s we wszystkich podkatalogach, ale przeszukuje tylko najwyższy poziom bin
.
Aby wyszukać katalogi, możesz użyć -Directory
, ale musisz usunąć końcowy znak zastępczy. Z jakiegokolwiek powodu nie spowoduje to dezaktywacji -Recurse
. Z tych powodów polecam nie używać wbudowanych flag.
Możesz znacznie skrócić to polecenie:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
staje się
gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
Get-ChildItem
jest aliasowany do gci
-Path
jest ustawiona domyślnie na pozycję 0, więc możesz po prostu utworzyć ścieżkę pierwszego argumentu-Recurse
jest aliasowany do -s
-Include
nie ma stenografiiSpróbuj tego:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
do wykluczenia folderów
Filtruj za pomocą symboli wieloznacznych:
Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse
Filtrowanie przy użyciu wyrażenia regularnego:
Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }
'\ACopyForBuild\.(bat|cmd)\Z'
?