Я хочу сделать что-то подобное:
<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 применять их только к соответствующему переключателю, что неверно?
Обратите внимание, что это всего лишь пример , поэтому меня не интересуют какие-либо обходные пути, специфичные для этой функции. Я ищу ответ на свой общий вопрос об условном трубопроводе, а не решение о том, как выполнить эту конкретную задачу.