Можно ли передать в Powershell условно, то есть выполнить элемент конвейера, только если условие выполнено?

Я хочу сделать что-то вроде этого:

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

Результаты & lt; утверждения & gt; запустить через & lt; filter1 & gt ;, затем они пройдут через & lt; filter2 & gt; только если & lt; условие & gt; выполняется через остальные фильтры, независимо от того, & lt; filter2 & gt; был применен. Это эквивалент:

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

Это было бы полезно в функциях, где данный фильтр применяется к результирующему набору, только если был вызван определенный переключатель. Если условный фильтр встречается рано в длинном конвейере, запись его с помощью внешнего блока if приводит к большому количеству повторений кода, особенно если имеется более одного условного фильтра.

Вот пример. Следующая функция показывает разрешения, которые данная учетная запись имеет в данном поддереве каталога (например,Show-AccountPerms \\SERVERX\Marketing DOMAIN\jdoe выдает отчет о разрешениях, которые пользователь DOMAIN \ jdoe имеет в дереве каталогов в папке \ 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
            }
        }
    }
}

По умолчанию он показывает только явные разрешения (обеспечивается| where {$_.isinherited -eq 'False'} фильтр), и только для каталогов (обеспечивается|where {$_.psiscontainer} фильтр).

Тем не менее, я хочу игнорировать|where {$_.psiscontainer} если активирован ключ -files, и игнорировать| where {$_.isinherited -eq 'False'} если вызывается ключ -inherited. Выполнение этого с внешним if блоки будет в четыре раза код, и почти 75% этого будет повторение. Есть ли способ сохранить эти фильтры включенными, но дать команду PowerShell применить их только к соответствующему ключу?

Обратите внимание, что это простоexampleпоэтому меня не интересуют какие-либо обходные пути, специфичные для этой функции. Я ищу ответ на мой общий вопрос относительно условного трубопровода, а не решение, как выполнить эту конкретную задачу.

Ответы на вопрос(6)

Ваш ответ на вопрос