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
sorprendentementefoo/@{FullName=bar}
- con
ForEach
-operator lo esperado:foo/bar
Mi solución se basa en el artículo de TechNet Cosas divertidas que puede hacer con el cmdlet Get-ChildItem .
Get-ChildItem C:/foo | Where-Object {$_.mode -match "d"}
Lo usé en mi script, y funciona bien.
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).