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?
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?
Respuestas:
Use el cmdlet Get-ChildItem con el modificador-Recurse
:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
seguido dels -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
) 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
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 FolderName
y / 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 FolderFoo
y FolderBar
PowerShell 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}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
También funcionará
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 -File
o -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 $false
directorios 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 -Include
con un archivo, debe finalizar la ruta con un comodín. Sin embargo, esto desactiva el -Recurse
interruptor sin decirte:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Pensaría que eso le daría todos *.lib
los 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íaPrueba esto:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
para excluir carpetas
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' }
'\ACopyForBuild\.(bat|cmd)\Z'
?