Búsqueda recursiva de archivos con PowerShell

238

Estoy buscando un archivo en todas las carpetas.

Copyforbuild.bat está disponible en muchos lugares, y me gustaría buscar de forma recursiva.

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

¿Cómo puedo hacerlo en PowerShell?

Samselvaprabu
fuente

Respuestas:

393

Use el cmdlet Get-ChildItem con el modificador-Recurse :

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
Shay Levy
fuente
1
Parece tener un problema que si se ejecuta en un directorio al que no tiene permiso de acceso, la búsqueda completa se cancela porque el proceso finaliza. ¿Hay alguna manera de evitar eso?
deed02392
66
Intente establecer el parámetro ErrorAction en Continue o SilentlyContinue (en caso de que su valor no sea el mencionado).
Shay Levy
22
Una forma más corta de hacer exactamente lo mismo: cd V:\MyFolderseguido dels -r -inc CopyForBuild.bat
Orion Edwards
8
Entonces, lo que significan los comentaristas anteriores es ...ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
Andrew
Adapte esta respuesta para hacer una cadena parcial agregando el símbolo astrico ( *) al final del nombre del archivo. ****** 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 uso para buscar archivos y luego hacer que PowerShell muestre la ruta completa de los resultados:

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

Siempre puede usar el comodín *en FolderNamey / o FileName.fileExtension. Por ejemplo:

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

El ejemplo anterior buscará cualquier carpeta en la C:\unidad que comience con la palabra Folder. Entonces, si tiene una carpeta llamada FolderFooy FolderBarPowerShell mostrará los resultados de ambas carpetas.

Lo mismo ocurre con el nombre y la extensión del archivo. Si desea buscar un archivo con una determinada extensión, pero no conoce el nombre del archivo, puede usar:

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

O viceversa:

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
BinaryJoe01
fuente
44
Encuentro esta respuesta extremadamente útil porque aborda un caso de uso en particular: realmente quiero usar el archivo que está buscando. El | Al darle el nombre completo del archivo es algo que falta en las otras respuestas.
Desarrollador Newteq
1
Tengo que estar de acuerdo con @ Sanity1123 aquí, si realmente quieres usar el archivo, necesitarás la ruta completa al archivo. En mi humilde opinión, esta debería ser la respuesta aceptada.
uceumern
31

Cuando busque carpetas en las que pueda obtener un error basado en la seguridad (por ejemplo C:\Users), use el siguiente comando:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
Mötz
fuente
12
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

También funcionará

usuario3303020
fuente
Y si desea generar resultados en un archivo, puede agregar `> path_to_filename.txt` al final del comando.
Gwen Au
7

Aquí está el método que finalmente se me ocurrió después de luchar:

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

Para hacer que la salida sea más limpia (solo ruta), use:

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

Para obtener solo el primer resultado, use:

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

Ahora para las cosas importantes:

Para buscar solo archivos / directorios, no use -Fileo -Directory(vea a continuación por qué). En su lugar, use esto para archivos:

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

y elimine los -eq $falsedirectorios for. No , no dejar un comodín como se arrastrabin/* .

¿Por qué no usar los interruptores integrados? Son terribles y eliminan características al azar. Por ejemplo, para usar -Includecon un archivo, debe finalizar la ruta con un comodín. Sin embargo, esto desactiva el -Recurseinterruptor sin decirte:

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

Pensaría que eso le daría todos *.liblos correos electrónicos en todos los subdirectorios, pero solo buscará el nivel superior de bin.

Para buscar directorios, puede usar -Directory, pero luego debe eliminar el comodín final. Por alguna razón, esto no se desactivará -Recurse. Es por estas razones que recomiendo no usar las banderas incorporadas.

Puede acortar este comando considerablemente:

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

se convierte

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
  • Get-ChildItem tiene un alias gci
  • -Path está predeterminado en la posición 0, por lo que puede hacer la primera ruta de argumento
  • -Recurse tiene un alias -s
  • -Include no tiene taquigrafía
  • Use comillas simples para espacios en nombres / rutas, de modo que pueda rodear todo el comando con comillas dobles y usarlo en el Símbolo del sistema. Hacerlo al revés (rodear con comillas simples) causa errores
hLk
fuente
6

Prueba esto:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
Siete veces
fuente
2
También puede usar | Where-Object { !$_PSIsContainer }para excluir carpetas
Gargravarr
5

Filtrar con comodines:

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

Filtrar usando una expresión regular:

Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }
MovGP0
fuente
1
¿No debería ser '\ACopyForBuild\.(bat|cmd)\Z'?
E. Sundin
1

Para agregar a @ user3303020 responder y generar los resultados de búsqueda en un archivo, puede ejecutar

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

Puede ser más fácil buscar el archivo correcto de esa manera.

Gwen Au
fuente