2010-07-17 10 views
10

Powershell verwendet Ich kann die Verzeichnisse mit dem folgenden Befehl erhalten:Wie schreibe ich eine PowerShell-Funktion, um Verzeichnisse zu bekommen?

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

Ich würde es vorziehen, eine Funktion zu schreiben, so dass der Befehl mehr lesbar ist. Zum Beispiel:

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

und die folgenden Funktion genau das tut, außer für den Umgang mit -Recurse elegant:

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

Wie kann ich die if Aussage von meiner Get-Verzeichnissen Funktion entfernen oder ist dies ein besserer Weg zu TU es? diese

+1

Betrachten Verwenden Sie -Filter anstelle von -Include, es sei denn, Sie müssen mehrere Elemente einschließen. Für etwas wie * .txt kann -Filter wesentlich schneller sein. Oder Sie könnten immer beide hinzufügen. –

Antwort

13

Versuchen:

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

Dies funktioniert, weil -Recurse: false $ ist das gleiche hat -Recurse überhaupt nicht mit.

+1

Vielen Dank für die Antwort und die extra Meile der Festsetzung des Funktionsnamens und der Parameterdeklarationen. Mehr gelernt als ich gefragt habe. –

2

Die Antwort, die Oisin gibt, ist genau richtig. Ich wollte nur hinzufügen, dass dies nahe daran ist, eine Proxy-Funktion zu sein. Wenn Sie die PowerShell Community Extensions 2.0 installiert haben, haben Sie diese Proxy-Funktion bereits. Sie müssen es aktivieren (es ist standardmäßig deaktiviert). Redigieren Sie einfach den Pscx.UserPreferences.ps1 Datei und diese Zeile ändern, damit er auf $ true festgelegt wird, wie unten dargestellt:

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

Beachten Sie die Einschränkung in Bezug auf dynamische Parameter. Nun, wenn Sie PSCX importieren tun es etwa so:

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

Jetzt können Sie dies tun:

Get-ChildItem . -r Bin -ContainerOnly 
+0

Vielen Dank für die Erinnerung an PowerShell Community Extensions. Ich hätte es als Referenz verwenden können. Da dies Teil eines Build-Prozesses ist, bleibe ich bei dem, was ich habe, weil ich keine weitere Abhängigkeit hinzufügen möchte. –

4

In Powershell 3.0 wird es gebacken mit -File-Directory Schalter:

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

Get-ChildItem -Directory – chris31389

Verwandte Themen