2010-07-17 7 views
10

Utilizzando PowerShell posso ottenere le directory con il seguente comando:Come scrivere una funzione di PowerShell per ottenere le directory?

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

preferirei scrivere una funzione in modo che il comando è più leggibile. Per esempio:

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

E la seguente funzione fa esattamente che, fatta eccezione per la gestione -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 } 
    } 
} 

Come posso rimuovere l'istruzione if dal mio Get-directory funzione o si tratta di un modo migliore per fallo?

+1

Considerare usando -Filter invece di -Include a meno che non sia necessario includere più elementi. Per qualcosa come * .txt, -Filter può essere significativamente più veloce. O potresti sempre aggiungere entrambi. –

risposta

13

Prova questa:

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

Questo funziona perché -Recurse: $ false è la stessa non abbia avendo -Recurse a tutti.

+1

Grazie per la risposta e il miglio supplementare di fissare il nome della funzione e le dichiarazioni dei parametri. Imparato più di quanto ho chiesto. –

2

La risposta di Oisin è azzeccata. Volevo solo aggiungere che si sta aggirando vicino a voler essere una funzione proxy. Se hai installato il 2.0 PowerShell Community Extensions, hai già questa funzione proxy. Devi abilitarlo (è disabilitato di default). Basta modificare il file Pscx.UserPreferences.ps1 e cambiare questa riga per cui è impostato su $ true come illustrato di seguito:

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

nota la limitazione per quanto riguarda i parametri dinamici. Ora, quando si importa PSCX farlo in questo modo:

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

Ora si può fare questo:

Get-ChildItem . -r Bin -ContainerOnly 
+0

Grazie per il promemoria delle estensioni della community PowerShell. Avrei potuto usarlo come riferimento Dato che questo fa parte di un processo di costruzione, rimarrò con ciò che ho perché non voglio aggiungere un'altra dipendenza. –

4

In PowerShell 3.0, è cotto con -File-Directory interruttori:

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

Get-ChildItem -Directory – chris31389

Problemi correlati