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?
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:
Utilizzare il cmdlet Get-ChildItem con l' -Recurse
opzione:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
seguito dals -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
) 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
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 FolderName
e / 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 FolderFoo
e FolderBar
PowerShell 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}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Funzionerà anche
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 -File
o -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 $false
directory 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 -Include
un file, è necessario terminare il percorso con un carattere jolly. Tuttavia, questo disabilita l' -Recurse
interruttore senza dirti:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Penseresti che ti darebbe tutto *.lib
in 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 scorciatoiaProva questo:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
per escludere le cartelle
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' }
'\ACopyForBuild\.(bat|cmd)\Z'
?