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