パイプライン内でif
を使用しようとしています。
where
(別名?
)フィルターがあることは知っていますが、特定の条件が満たされた場合にのみフィルターをアクティブにしたい場合はどうすればよいですか?
つまり、たとえば:
get-something | ? {$ _。someone-eq'somespecific '} | format-table
パイプライン内でif
を使用してフィルターのオン/オフを切り替える方法は?出来ますか?それは意味がありますか?
ありがとう
明確にするために編集
パイプラインがないと、次のようになります。
if($ filter){ get-something | ? {$ _。someone-eq'somespecific '} } else { get-something }
ANSWERのriknikの後に編集
私が探していたものを示す愚かな例。変数$data
に格納されているデータの非正規化テーブルがあり、一種の「ドリルダウン」データフィルタリングを実行したい場合:
function datafilter { param([switch] $ ancestor、 [switch] $ parent、 [switch] $ child、 [string ] $ myancestor、 [string] $ myparent、 [string] $ mychild、 [array] $ data = []) $ data | ? {(!$ ancestor)-or($ _。ancestor-match $ myancestor)} | ? {(!$ parent)-or($ _。parent-match $ myparent)} | ? {(!$ child)-または($ _。child-match $ mychild)} | }
たとえば、特定の親のみでフィルタリングする場合は、次のようにします。
datafilter -parent -myparent 'myparent' -data $mydata
これは、?
を活用するための非常にエレガントで、パフォーマンスが高く、簡単な方法です。 if
を使用して同じことを試してみてください。そうすれば、私が何を意味するのか理解できます。
Where-objectを使用する場合、条件はパイプラインを通過するオブジェクトに厳密に関連している必要はありません。したがって、他の条件が満たされた場合にのみ、奇数のオブジェクトをフィルタリングしたい場合を考えてみましょう。
$filter = $true
1..10 | ? { (-not $filter) -or ($_ % 2) }
$filter = $false
1..10 | ? { (-not $filter) -or ($_ % 2) }
このようなものをお探しですか?
独自のフィルターを作成してみましたか。 (ばかげた)例:
filter MyFilter {
if ( ($_ % 2) -eq 0) { Write-Host $_ }
else { Write-Host ($_ * $_) }
}
PS> 1,2,3,4,5,6,7,8,9 | MyFilter
1
2
9
4
25
6
49
8
81
私の答えがあなたを助けることができるかどうかはわかりませんが、私は試してみます:)
1..10 | % {if ($_ % 2 -eq 0) {$_}}
ご覧のとおり、ループを使用し、1から10までの各数値について、偶数かどうかを確認し、この場合にのみ表示します。