私はこのようなことをしたい:
<statement> | <filter1> | <filter2> if <condition> | <filter3> | <filter4> | <filter5>
<statement>の結果は<filter1>を通過し、次に<condition>が満たされた場合にのみ<filter2>を通過し、次に<filter2>が適用されたかどうかに関係なく残りのフィルターを通過します。これは次と同等です。
if (<condition>) {
<statement> | <filter1> | <filter2> | <filter3> | <filter4> | <filter5>
} else {
<statement> | <filter1> | <filter3> | <filter4> | <filter5>
}
これは、特定のスイッチが呼び出された場合にのみ、特定のフィルターが結果セットに適用される関数で役立ちます。条件付きフィルターが長いパイプラインの早い段階で発生する場合、特に複数の条件付きフィルターがある場合は、外側のif-blockを使用してコードを書き込むと、コードが何度も繰り返されます。
これが例です。次の関数は、特定のアカウントが特定のディレクトリサブツリーで持つアクセス許可を示します(たとえば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スイッチが呼び出された場合は無視します。これをouterifブロックで達成すると、コードが4倍になり、そのほぼ75%が繰り返しになります。これらのフィルターをインラインに保つ方法はありますが、対応するスイッチのフィルターのみを適用するようにPowerShellに指示するのは誤りですか?
これは単なる例であるため、この関数に固有の回避策には関心がないことに注意してください。私は、この特定のタスクを実行する方法の解決策ではなく、条件付きで配管に関する私の一般的な質問に対する答えを探しています。