web-dev-qa-db-ja.com

パイプライン内で「if」ステートメントを使用する方法

パイプライン内で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を使用して同じことを試してみてください。そうすれば、私が何を意味するのか理解できます。

15
Emiliano Poggi

Where-objectを使用する場合、条件はパイプラインを通過するオブジェクトに厳密に関連している必要はありません。したがって、他の条件が満たされた場合にのみ、奇数のオブジェクトをフィルタリングしたい場合を考えてみましょう。

$filter = $true
1..10 | ? { (-not $filter) -or ($_ % 2) }

$filter = $false
1..10 | ? { (-not $filter) -or ($_ % 2) }

このようなものをお探しですか?

15
Daniel Richnak

独自のフィルターを作成してみましたか。 (ばかげた)例:

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
3

私の答えがあなたを助けることができるかどうかはわかりませんが、私は試してみます:)

1..10 | % {if ($_ % 2 -eq 0) {$_}} 

ご覧のとおり、ループを使用し、1から10までの各数値について、偶数かどうかを確認し、この場合にのみ表示します。

2
Nicola Cossu