Ricerca di file ricorsiva tramite PowerShell


238

Sto cercando un file in tutte le cartelle.

Copyforbuild.bat è disponibile in molti luoghi e vorrei effettuare ricerche ricorsive.

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

Come posso farlo in PowerShell?

Risposte:


393

Utilizzare il cmdlet Get-ChildItem con l' -Recurseopzione:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

1
Sembra che si verifichi che se si esegue in una directory non si dispone dell'autorizzazione per accedere, l'intera ricerca viene interrotta perché il processo termina. C'è un modo per aggirare questo?
deed02392,

6
Prova a impostare il parametro ErrorAction su Continue o SilentlyContinue (nel caso in cui il suo valore non sia come indicato).
Shay Levy,

22
Un modo più breve di fare esattamente la stessa cosa: cd V:\MyFolderseguito dals -r -inc CopyForBuild.bat
Orion Edwards il

8
Quindi ciò che significano i commentatori sopra è ...ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
Andrew

Ho adattato questa risposta per fare una stringa parziale aggiungendo il simbolo astrico ( *) alla fine del nome del file. ****** LINE1: $File = "Microsoft.OData.Core.NetFX35.V7*"LINE2: $Folder = "C:\Program Files"LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
SherlockSpreadsheets

37

Lo utilizzo per trovare i file e quindi far visualizzare a PowerShell l'intero percorso dei risultati:

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

È sempre possibile utilizzare il carattere jolly *in FolderNamee / o FileName.fileExtension. Per esempio:

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

L'esempio sopra cercherà qualsiasi cartella nell'unità che C:\inizia con la parola Folder. Pertanto, se si dispone di una cartella denominata FolderFooe FolderBarPowerShell mostrerà i risultati di entrambe le cartelle.

Lo stesso vale per il nome del file e l'estensione del file. Se si desidera cercare un file con una determinata estensione, ma non si conosce il nome del file, è possibile utilizzare:

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

O vice versa:

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

4
Trovo questa risposta estremamente utile perché si rivolge a un caso d'uso particolare: in realtà si desidera utilizzare il file che si sta cercando. Il | per darti il ​​nome completo del file manca qualcosa nelle altre risposte.
Sviluppatore Newteq

1
Devo essere d'accordo con @ Sanity1123 qui, se si desidera effettivamente utilizzare il file, sarà necessario il percorso completo del file. IMHO questa dovrebbe essere la risposta accettata.
martedì

31

Quando si cercano cartelle in cui è possibile che si verifichi un errore in base alla sicurezza (ad es. C:\Users), Utilizzare il comando seguente:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

12
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

Funzionerà anche


E se vuoi produrre risultati in un file, puoi aggiungere `> path_to_filename.txt` alla fine del comando.
Gwen Au,

7

Ecco il metodo che ho finalmente escogitato dopo aver lottato:

Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*

Per rendere più pulito l'output (solo percorso), utilizzare:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname

Per ottenere solo il primo risultato, utilizzare:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1

Ora per le cose importanti:

Per cercare solo file / directory non utilizzare -Fileo -Directory(vedere di seguito perché). Invece usa questo per i file:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

e rimuovere le -eq $falsedirectory for. Evitare Non lasciare un jolly finale come bin/*.

Perché non utilizzare gli switch integrati? Sono terribili e rimuovono le funzionalità in modo casuale. Ad esempio, per utilizzare -Includeun file, è necessario terminare il percorso con un carattere jolly. Tuttavia, questo disabilita l' -Recurseinterruttore senza dirti:

Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib

Penseresti che ti darebbe tutto *.libin tutte le sottodirectory, ma cercherà solo il livello più alto di bin.

Per cercare directory, puoi usare -Directory , ma è necessario rimuovere il carattere jolly finale. Per qualsiasi motivo, questo non si disattiva -Recurse. È per questi motivi che consiglio di non usare i flag incorporati.

È possibile abbreviare considerevolmente questo comando:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

diventa

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
  • Get-ChildItem è alias gci
  • -Path è predefinito nella posizione 0, quindi puoi semplicemente creare il primo percorso dell'argomento
  • -Recurse è alias -s
  • -Include non ha una scorciatoia
  • Utilizzare virgolette singole per gli spazi nei nomi / percorsi, in modo da poter racchiudere l'intero comando tra virgolette doppie e utilizzarlo nel Prompt dei comandi. Farlo al contrario (circondare con virgolette singole) provoca errori

6

Prova questo:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}

2
Puoi anche utilizzare | Where-Object { !$_PSIsContainer }per escludere le cartelle
Gargravarr,

5

Filtra usando i caratteri jolly:

Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse

Filtro usando un'espressione regolare:

Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }

1
Non dovrebbe essere '\ACopyForBuild\.(bat|cmd)\Z'?
E. Sundin,

1

Per aggiungere a @ user3303020 la risposta e generare i risultati della ricerca in un file, è possibile eseguire

Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat > path_to_results_filename.txt

In questo modo potrebbe essere più semplice cercare il file corretto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.