¿Es posible canalizar condicionalmente en Powershell, es decir, ejecutar un elemento de una tubería solo si se cumple una condición?

Quiero hacer algo como esto:

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

Los resultados de <statement> se ejecutan en <filter1>, luego se ejecutan en <filter2> solo si se cumple <condition>, luego en los filtros restantes, independientemente de si se aplicó <filter2>. Este es el equivalente de:

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

Esto sería útil en funciones donde un filtro dado se aplica al conjunto de resultados solo si se invoca un determinado interruptor. Si el filtro condicional se produce al principio de una tubería larga, escribirlo con un bloque if exterior da como resultado una gran cantidad de repetición de código, especialmente si hay más de un filtro condicional.

Aquí hay un ejemplo. La siguiente función muestra los permisos que tiene una cuenta determinada en un subárbol de directorio determinado (por ejemplo,Show-AccountPerms \\SERVERX\Marketing DOMAIN\jdoe proporciona un informe de los permisos que el usuario DOMAIN \ jdoe tiene en el árbol de directorios en \ 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
            }
        }
    }
}

Por defecto, solo muestra permisos explícitos (forzados por el| where {$_.isinherited -eq 'False'} filtro), y solo en directorios (impuesta por el|where {$_.psiscontainer} filtrar).

Sin embargo, quiero ignorar|where {$_.psiscontainer} si se invoca el modificador -files, e ignore| where {$_.isinherited -eq 'False'} si se invoca el modificador heredado. Lograr esto con los bloques externos si se cuadruplicara el código, y casi el 75% sería repetición. ¿Hay alguna manera de mantener estos filtros en línea pero dar instrucciones a powershell para que solo los apliquen si el interruptor correspondiente es falso?

Tenga en cuenta que esto es sólo unejemplo, entonces no estoy interesado en ninguna solución específica para esta función. Estoy buscando una respuesta a mi pregunta general con respecto a la tubería de manera condicional, no una solución para cómo llevar a cabo esta tarea en particular.

Respuestas a la pregunta(6)

Su respuesta a la pregunta