Ist es möglich, Rohr bedingt in Powershell, d.h. führen Sie ein element einer pipeline nur, wenn eine Bedingung erfüllt ist?

Möchte ich etwas wie das hier tun:

<statement> | <filter1> | <filter2> if <condition> | <filter3> | <filter4> | <filter5>

Den Ergebnissen <statement> starten Sie durch <filter1>, dann laufen Sie durch <filter2> erst wenn <Bedingung> erfüllt ist, dann durch die restlichen Filter, unabhängig davon, ob <filter2> angewendet wurde. Dies ist das äquivalent von:

if (<condition>) {
  <statement> | <filter1> | <filter2> | <filter3> | <filter4> | <filter5>
} else {
  <statement> | <filter1> | <filter3> | <filter4> | <filter5>
}

Dies wäre nützlich bei Funktionen, bei denen ein filter angewendet wird, um die Ergebnismenge nur, wenn ein bestimmter Schalter aufgerufen wurde. Wenn die Auswertung der filter erfolgt früh in einer langen pipeline, schreiben Sie es mit einer äußeren if-block Ergebnisse in eine Menge von Wiederholung von code, vor allem wenn es mehr als eine bedingte filter.

Hier ist ein Beispiel. Die folgende Funktion zeigt die Berechtigungen für ein bestimmtes Konto in ein bestimmtes Verzeichnis-Teilbaum (z.B. Show-AccountPerms \\SERVERX\Marketing DOMAIN\jdoe gibt einen Bericht von Berechtigungen, die der Benutzer DOMAIN\jdoe hat in den Verzeichnisbaum unter \SERVERX\Marketing).

function Show-AccountPerms {
    param (
        [parameter(mandatory = $true)]$rootdir,
        [parameter(mandatory = $true)]$account,
        [switch]$files,
        [switch]$inherited
    )
    gci -r $rootdir `
    |where {$_.psiscontainer} `
    |foreach {
        $dir = $_.fullname
        (get-acl $_.pspath).access `
        | where {$_.isinherited -eq 'False'} `
        |foreach {
            if ($_.identityreference -eq $account) {
                "{0,-25}{1,-35}{2}" -f $_.identityreference, $_.filesystemrights, $dir
            }
        }
    }
}

Standardmäßig, es zeigt nur explizite Berechtigungen (erzwungen durch die | where {$_.isinherited -eq 'False'} filter), und nur auf Verzeichnisse (erzwungen durch die |where {$_.psiscontainer} filter).

Allerdings möchte ich zu ignorieren |where {$_.psiscontainer} wenn die -Dateien-Schalter aufgerufen wird, und ignorieren | where {$_.isinherited -eq 'False'} wenn die geerbte Schalter aufgerufen wird. Dies zu erreichen mit dem äußeren, wenn Blöcke vervierfachen sich den code, und fast 75% wäre es Wiederholung. Gibt es einen Weg, um diese Filter in-line, aber anweisen, powershell gelten nur für die Ihnen von der entsprechende Schalter ist falsch?

Bitte beachten Sie, dass dies nur ein Beispiel, also ich bin nicht daran interessiert, irgendwelche workarounds, die spezifisch für diese Funktion. Ich bin auf der Suche nach einer Antwort auf meine Allgemeine Frage bezüglich Rohrleitungen bedingt, nicht eine Lösung, wie dies zu erreichen bestimmte Aufgabe.

InformationsquelleAutor Adi Inbar | 2012-07-23
Schreibe einen Kommentar