2010-07-17 17 views
10

uso de PowerShell que puedo conseguir los directorios con el comando siguiente:¿Cómo escribir una función de PowerShell para obtener directorios?

Get-ChildItem -Path $path -Include "obj" -Recurse | ` 
    Where-Object { $_.PSIsContainer } 

yo preferiría escribir una función para que el comando es más fácil de leer. Por ejemplo:

Get-Directories -Path "Projects" -Include "obj" -Recurse 

Y la siguiente función hace exactamente eso a excepción del manejo -Recurse elegantemente:

Function Get-Directories([string] $path, [string] $include, [boolean] $recurse) 
{ 
    if ($recurse) 
    { 
     Get-ChildItem -Path $path -Include $include -Recurse | ` 
      Where-Object { $_.PSIsContainer } 
    } 
    else 
    { 
     Get-ChildItem -Path $path -Include $include | ` 
      Where-Object { $_.PSIsContainer } 
    } 
} 

¿Cómo puedo quitar la instrucción if de mi función directorios tienen o se trata de una mejor manera de ¿hazlo?

+1

Considérese utilizando -Filtro en lugar de -Incluir a menos que necesite incluir varios elementos. Para algo como * .txt, -Filter puede ser significativamente más rápido. O siempre puedes agregar ambos. –

Respuesta

13

Prueba esto:

# nouns should be singular unless results are guaranteed to be plural. 
# arguments have been changed to match cmdlet parameter types 
Function Get-Directory([string[]]$path, [string[]]$include, [switch]$recurse) 
{ 
    Get-ChildItem -Path $path -Include $include -Recurse:$recurse | ` 
     Where-Object { $_.PSIsContainer } 
} 

Esto funciona porque -Recurse: $ falso es el mismo no ha -Recurse tener en absoluto.

+1

Gracias por la respuesta y la milla extra de corregir el nombre de la función y las declaraciones de parámetros. Aprendí más de lo que pedí. –

2

La respuesta que ofrece Oisin es perfecta. Solo quería agregar que esto está cerca de querer ser una función proxy. Si tiene el PowerShell Community Extensions 2.0 instalado, ya tiene esta función de proxy. Tienes que habilitarlo (está deshabilitado por defecto). Basta con modificar el archivo Pscx.UserPreferences.ps1 y cambiar esta línea por lo que se establece en $ true, como se muestra a continuación:

GetChildItem = $true # Adds ContainerOnly and LeafOnly parameters 
        # but doesn't handle dynamic params yet. 

Nota la limitación relativa a los parámetros dinámicos. Ahora bien, cuando se importa PSCX hacerlo de esta manera:

Import-Module Pscx -Arg [path to Pscx.UserPreferences.ps1] 

Ahora usted puede hacer esto:

Get-ChildItem . -r Bin -ContainerOnly 
+0

Gracias por el recordatorio de las extensiones de comunidad de PowerShell. Podría haberlo usado como referencia. Como esto es parte de un proceso de compilación, me quedaré con lo que tengo porque no quiero agregar otra dependencia. –

4

En PowerShell 3.0, que se cuece en la -File-Directory interruptores:

dir -Directory #List only directories 
dir -File #List only files 
+0

Get-ChildItem -Directory – chris31389

Cuestiones relacionadas