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

Я хочу сделать что-то подобное:

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

Результаты <оператора> проходят через <фильтр1>, затем они проходят через <фильтр2>, только если выполняется <условие>, а затем через остальные фильтры независимо от того, применялся ли <фильтр2>. Это эквивалент:

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}, если вызывается переключатель файлов -,и игнорировать | where {$_.isinherited -eq 'False'}, если вызывается унаследованный переключатель -. Выполнение этого с внешними блоками if увеличило бы код в четыре раза, и почти 75% его было бы повторением. Есть ли способ сохранить эти фильтры в строке -, но указать powershell применять их только к соответствующему переключателю, что неверно?

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

13
задан Adi Inbar 23 July 2012 в 22:16
поделиться