powershell - Como faço para obter apenas diretórios usando Get-ChildItem?




powershell-v2.0 (10)

Estou usando o PowerShell 2.0 e quero distribuir todos os subdiretórios de um determinado caminho. O comando a seguir exibe todos os arquivos e diretórios, mas não consigo descobrir como filtrar os arquivos.

Get-ChildItem c:\mypath -Recurse

Eu tentei usar $_.Attributes para obter os atributos, mas então eu não sei como construir uma instância literal de System.IO.FileAttributes para compará-lo. Em cmd.exe seria

dir /b /ad /s

A resposta aceita menciona

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

para obter uma "string raw". Mas, na verdade, objetos do tipo Selected.System.IO.DirectoryInfo serão retornados. Para strings não processadas, o seguinte pode ser usado:

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }

A diferença é importante se o valor for concatenado para uma string:

  • com Select-Object surpreendentemente foo\@{FullName=bar}
  • com o ForEach -operator o esperado: foo\bar

Do PowerShell v2 e mais recente (k representa a pasta na qual você está iniciando sua pesquisa):

Get-ChildItem $Path -attributes D -Recurse

Se você quiser apenas nomes de pastas e nada mais, use isto:

Get-ChildItem $Path -Name -attributes D -Recurse

Se você estiver procurando por uma pasta específica, poderá usar o seguinte. Neste caso, estou procurando uma pasta chamada myFolder :

Get-ChildItem $Path -attributes D -Recurse -include "myFolder"


No PowerShell 3.0, é mais simples:

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files

Uma abordagem mais legível e simples poderia ser obtida com o script abaixo:

$Directory = "./"
Get-ChildItem $Directory -Recurse | % {
    if ($_.Attributes -eq "Directory") {
        Write-Host $_.FullName
    }
}

Espero que isto ajude!


Uma abordagem mais limpa:

Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}

Gostaria de saber se o PowerShell 3.0 tem um comutador que apenas retorna diretórios; Parece uma coisa lógica para adicionar.


Usar:

dir -Directory -Recurse | Select FullName

Isso lhe dará uma saída da estrutura raiz com o nome da pasta apenas para diretórios.


Usar:

Get-ChildItem \\myserver\myshare\myshare\ -Directory | Select-Object -Property name |  convertto-csv -NoTypeInformation  | Out-File c:\temp\mydirectorylist.csv

Qual faz o seguinte

  • Obter uma lista de diretórios no local de destino: Get-ChildItem \\myserver\myshare\myshare\ -Directory
  • Extraia apenas o nome dos diretórios: Select-Object -Property name
  • Converta a saída para o formato CSV: convertto-csv -NoTypeInformation
  • Salve o resultado em um arquivo: Out-File c:\temp\mydirectorylist.csv

Você vai querer usar Get-ChildItem para obter recursivamente todas as pastas e arquivos primeiro. E, em seguida, canalize essa saída em uma cláusula Where-Object que apenas pega os arquivos.

# one of several ways to identify a file is using GetType() which
# will return "FileInfo" or "DirectoryInfo"
$files = Get-ChildItem E:\ -Recurse | Where-Object {$_.GetType().Name -eq "FileInfo"} ;

foreach ($file in $files) {
  echo $file.FullName ;
}

Para versões do PowerShell inferiores a 3.0:

O objeto FileInfo retornado por Get-ChildItem tem uma propriedade "base", PSIsContainer . Você deseja selecionar apenas esses itens.

Get-ChildItem -Recurse | ?{ $_.PSIsContainer }

Se você quiser os nomes das strings brutas dos diretórios, você pode fazer

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

Para o PowerShell 3.0 e superior:

dir -Directory




powershell-v2.0