what the subfolders recursively files and powershell powershell-v2.0

powershell - the - ¿Cómo obtengo solo directorios usando Get-ChildItem?



powershell ls (15)

Desde PowerShell v2 y más reciente (k representa la carpeta en la que está comenzando su búsqueda):

Get-ChildItem $Path -attributes D -Recurse

Si solo desea nombres de carpeta, y nada más, use esto:

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

Si está buscando una carpeta específica, puede usar lo siguiente. En este caso, estoy buscando una carpeta llamada myFolder :

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

Estoy usando PowerShell 2.0 y quiero canalizar todos los subdirectorios de una ruta determinada. El siguiente comando genera todos los archivos y directorios, pero no puedo descifrar cómo filtrar los archivos.

Get-ChildItem c:/mypath -Recurse

He intentado usar $_.Attributes para obtener los atributos, pero no sé cómo construir una instancia literal de System.IO.FileAttributes para compararla. En cmd.exe sería

dir /b /ad /s


En PowerShell 3.0, es más simple:

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


La respuesta aceptada menciona

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

para obtener una "cadena sin procesar". Pero, de hecho, se devolverán los objetos del tipo Selected.System.IO.DirectoryInfo . Para cadenas sin formato, se puede usar lo siguiente:

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

La diferencia importa si el valor se concatena a una cadena:

  • con Select-Object sorprendentemente foo/@{FullName=bar}
  • con ForEach -operator lo esperado: foo/bar


Para responder la pregunta original específicamente (usando IO.FileAttributes):

Get-ChildItem c:/mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}

Sin embargo, prefiero la solución de Marek ( Where-Object { $_ -is [System.IO.DirectoryInfo] } ).


Se requiere menos texto con este enfoque:

ls -r | where {$_.mode -match "d"}


Un enfoque más limpio:

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

Me pregunto si PowerShell 3.0 tiene un interruptor que solo devuelve directorios; parece algo lógico agregar.


Un enfoque un poco más legible y simple podría lograrse con el siguiente script:

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

¡Espero que esto ayude!


Usa este:

Get-ChildItem -Path //server/share/folder/ -Recurse -Force | where {$_.Attributes -like ''*Directory*''} | Export-Csv -Path C:/Temp/Export.csv -Encoding "Unicode" -Delimiter ";"


Utilizar:

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

Que hace lo siguiente

  • Obtenga una lista de directorios en la ubicación de destino: Get-ChildItem //myserver/myshare/myshare/ -Directory
  • Extraiga solo el nombre de los directorios: Select-Object -Property name
  • Convierta la salida al formato CSV: convertto-csv -NoTypeInformation
  • Guarde el resultado en un archivo: Out-File c:/temp/mydirectorylist.csv

Utilizar:

dir -Directory -Recurse | Select FullName

Esto le dará un resultado de la estructura raíz con el nombre de la carpeta solo para directorios.


Utilizar:

dir -r | where { $_ -is [System.IO.DirectoryInfo] }


Para las versiones de PowerShell inferiores a 3.0:

El objeto FileInfo devuelto por Get-ChildItem tiene una propiedad "base", PSIsContainer . Desea seleccionar solo esos elementos.

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

Si desea los nombres de las cadenas en bruto de los directorios, puede hacer

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

Para PowerShell 3.0 y superior:

dir -Directory


Querrá utilizar Get-ChildItem para obtener recursivamente todas las carpetas y archivos primero. Y luego canalice ese resultado a una cláusula Where-Object que solo tome los archivos.

# 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 ; }


Get-ChildItem -dir #lists only directories Get-ChildItem -file #lists only files

Si prefiere alias, use

ls -dir #lists only directories ls -file #lists only files

o

dir -dir #lists only directories dir -file #lists only files

Para recurrir a los subdirectorios también, agregue la opción -r .

ls -dir -r #lists only directories recursively ls -file -r #lists only files recursively

Probado en PowerShell 4.0, PowerShell 5.0 (Windows 10) y PowerShell Core 6.0 (Windows 10, Mac y Linux).