No soy codificador y agradecería cualquier ayuda.
Necesito un archivo por lotes que consulte una ubicación NAS y produzca una salida de los directorios del nivel superior (y tal vez del segundo nivel inferior). La estructura del archivo es la siguiente:
\\NAS-ip\home\user1
\\NAS-ip\home\user2
\\NAS-ip\home\user3
\\NAS-ip\home\user4
︙
\\NAS-ip\home\user99
La salida por lotes debería ser:
\\NAS-ip\home\user1,\\NAS-ip\home\user2,\\NAS-ip\home\user3,\\NAS-ip\home\user4 … etc.
Respuesta1
Potencia Shell:
Legible por humanos:
(@{Path = '\\NAS-ip\home' ; Levels = '2'} |
ForEach-Object {
Get-ChildItem -Path ($_.Path + ((@('\*') * $_.Levels) -join '')) |
Where-Object {$_.PsIsContainer} | Select-Object -ExpandProperty FullName
}) -join ','
Un trazador de líneas:
(@{Path = '\\NAS-ip\home' ; Levels = '2'} | ForEach-Object {Get-ChildItem -Path ($_.Path + ((@('\*') * $_.Levels) -join '')) | Where-Object {$_.PsIsContainer} | Select-Object -ExpandProperty FullName}) -join ','
Compacto:
(@{Path = '\\NAS-ip\home' ; Levels = '2'} | % {gci ($_.Path + ((@('\*') * $_.Levels) -join '')) | ? {$_.PsIsContainer} | select -Exp FullName}) -join ','
Cambia Path
y Levels
como mejor te parezca. Y le aconsejo que cambie el separador de ,
a algo como |
, porque la coma está permitida en los nombres de archivos y podría generar ambigüedad. Para cambiar el separador, edite el último -join ','
a -join '|'
.
Bonificación: para obtener una lista de subdirectorios en múltiples rutas iniciales, separe las tablas hash al principio con una coma:
(@{Path = '\\NAS-ip\home' ; Levels = '2'}, @{Path = '\\NAS2-ip\somedir' ; Levels = '3'} |
ForEach-Object {
Get-ChildItem -Path ($_.Path + ((@('\*') * $_.Levels) -join '')) |
Where-Object {$_.PsIsContainer} | Select-Object -ExpandProperty FullName
}) -join ','