悲しいかなくあなたが望むように言います。
技術的には、これはあなたが何を説明しているのですか。ありきたりではある:あなたが何かファンキーしたい場合
1..10 | %{
if ($_ % 2 -eq 0) { #even pipeline
$_ | write-host -ForegroundColor green #add whatever you want to happen on this pipeline instead of write-host
} else { #odd pipeline
$_ | write-host -ForegroundColor cyan #add whatever you want to happen on this pipeline instead of write-host
}
}
が、これはあまりにも動作します。多くのシナリオでは、より混乱しがちです。
$PipelineIfTrue = {
[CmdletBinding()]
param ([Parameter(ValueFromPipeline = $true)][PSObject]$InputObject)
process {
$InputObject | write-host -ForegroundColor green
}
}
$PipelineIfFalse = {
[CmdletBinding()]
param ([Parameter(ValueFromPipeline = $true)][PSObject]$InputObject)
process {
$InputObject | write-host -ForegroundColor cyan
}
}
1..10 | %{$_ | &@($PipelineIfFalse, $PipelineIfTrue)[($_ % 2 -eq 0)]}
つまり、パイプライン入力を受け取る2つのスクリプトブロックを作成します。あなたの条件が真と評価された場合に何をすべきかを定義するもの、偽に対するものです。
これらを配列に貼り付け、その配列のインデックスに条件の結果を使用します。すなわち、false(index = 0)の場合、PipelineIfFalse
スクリプトを返します。 trueの場合(index = 1)、PipelineIfTrue
を返します。
アンパサンドはこのスクリプトを実行するように指示しており、現在の値をこのスクリプトにパイプすると、この匿名関数のパイプラインの引数になります。
更新
私はサディストだから、私が乗って運ばれます。あなたはこれを行うことができます:
1..10 | Fork-Pipeline {$_ % 2 -eq 0} `
{ Write-Host -ForegroundColor green } `
{ Write-Host -ForegroundColor cyan }
またはここ
1..10 | Fork-Pipeline `
-If {$_ % 2 -eq 0} `
-Then { Write-Host -ForegroundColor green } `
-Else { Write-Host -ForegroundColor cyan }
は、コマンドレットです:
function Fork-Pipeline {
[CmdletBinding()]
param (
[Parameter(ValueFromPipeline = $true, Mandatory = $true)]
[PSObject]$InputObject
,
[Parameter(Mandatory = $true, Position=0)]
[Alias('If')]
[ScriptBlock]$Condition
,
[Parameter(Mandatory = $true, Position=1)]
[Alias('Then')]
[ScriptBlock]$PiplineIfTrue
,
[Parameter(Mandatory = $true, Position=2)]
[Alias('Else')]
[ScriptBlock]$PiplineIfFalse
)
begin {
#[string]$template = '[CmdletBinding()]param([Parameter(ValueFromPipeline=$true)]$InputObject)process{{$InputObject | {0}}}'
[string]$template = '$_ | {0}' #much simpler version of the above
$FunctionIfTrue = [scriptblock]::Create($template -f $PiplineIfTrue.ToString())
$FunctionIfFalse = [scriptblock]::Create($template -f $PiplineIfFalse.ToString())
}
process {
if (&$Condition) {
$InputObject | &$FunctionIfTrue
} else {
$InputObject | &$FunctionIfFalse
}
}
}
私もそのアプローチはお勧めしません。それは驚くほどうまく実行するつもりはなく、通常のPSパイプラインを扱うのに慣れている人は混乱するでしょう。学術的な楽しみのためだけに良い。
どのバージョンのPowerShellをターゲットにしていますか? –
最新です。 –