Estou procurando um arquivo em todas as pastas.
Copyforbuild.bat
está disponível em muitos lugares e eu gostaria de pesquisar recursivamente.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Como posso fazer isso no PowerShell?
Estou procurando um arquivo em todas as pastas.
Copyforbuild.bat
está disponível em muitos lugares e eu gostaria de pesquisar recursivamente.
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
Como posso fazer isso no PowerShell?
Respostas:
Use o cmdlet Get-ChildItem com a -Recurse
opção:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
seguido porls -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*
) ao final do nome do arquivo. ****** LINE1: $File = "Microsoft.OData.Core.NetFX35.V7*"
LINE2: $Folder = "C:\Program Files"
LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
Eu uso isso para encontrar arquivos e, em seguida, o PowerShell exibe o caminho inteiro dos resultados:
dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}
Você sempre pode usar o curinga *
no FolderName
e / ou FileName.fileExtension
. Por exemplo:
dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}
O exemplo acima irá procurar qualquer pasta no C:\
início de carro com a palavra Folder
. Portanto, se você tiver uma pasta chamada FolderFoo
e o FolderBar
PowerShell mostrará resultados de ambas as pastas.
O mesmo vale para o nome e a extensão do arquivo. Se você deseja procurar um arquivo com uma certa extensão, mas não sabe o nome do arquivo, pode usar:
dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}
Ou vice-versa:
dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Também vai funcionar
Aqui está o método que eu finalmente criei depois de lutar:
Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
Para tornar a saída mais limpa (somente caminho), use:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname
Para obter apenas o primeiro resultado, use:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1
Agora, o importante:
Para pesquisar apenas arquivos / diretórios, não use -File
ou -Directory
(veja abaixo o porquê). Em vez disso, use isso para arquivos:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
e remova os -eq $false
diretórios for. Você não deixar um curinga arrastando como bin/*
.
Por que não usar os switches integrados? Eles são terríveis e removem recursos aleatoriamente. Por exemplo, para usar -Include
com um arquivo, você deve finalizar o caminho com um curinga. No entanto, isso desativa a -Recurse
opção sem informar:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Você pensaria que isso daria todos os *.lib
s em todos os subdiretórios, mas somente o nível superior será pesquisado bin
.
Para procurar diretórios, você pode usar -Directory
, mas remover o curinga à direita. Por qualquer motivo, isso não será desativado -Recurse
. É por esses motivos que eu recomendo não usar os sinalizadores internos.
Você pode reduzir esse comando consideravelmente:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
torna-se
gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
Get-ChildItem
é um alias para gci
-Path
é o padrão para a posição 0, então você pode apenas fazer o primeiro caminho do argumento-Recurse
é um alias para -s
-Include
não tem taquigrafiaTente o seguinte:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }
para excluir pastas
Filtrar usando curingas:
Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse
Filtrando usando uma expressão regular:
Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }
'\ACopyForBuild\.(bat|cmd)\Z'
?