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:\MyFolderseguido 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 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}
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 -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í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'?