そのコマンド: & $EvaluateCondition $ObjectToTest— には何もバインドしません$_。param()にブロックがない場合ScriptBlock、 の値は$ObjectToTestにバインドされ$args[0]ます。
$SB = {"`$_: '$_'; `$args[0]:'$($args[0])'"}
1..3 | ForEach-Object {& $SB ($_+3)}
出力:
$_: '1'; $args[0]:'4'
$_: '2'; $args[0]:'5'
$_: '3'; $args[0]:'6'
参照が機能する理由:親スコープから変数を$_参照するだけです。$_
表示される値は$_、関数に渡された現在のパイプライン入力オブジェクトTest-Anyです。
function Test-Any {
param($EvaluateCondition)
process {
"Test-Any `$_: '$_'"
& $EvaluateCondition
}
}
1..2 | %{3..4 | Test-Any {"EvaluateCondition `$_:'$_'"}}
出力:
Test-Any $_: '3'
EvaluateCondition $_:'3'
Test-Any $_: '4'
EvaluateCondition $_:'4'
Test-Any $_: '3'
EvaluateCondition $_:'3'
Test-Any $_: '4'
EvaluateCondition $_:'4'
モジュール スコープで定義すると、パイプライン入力を含むTest-Any変数もそのモジュール スコープで定義され、その外部では使用できませんでした。$_Test-Any
New-Module {
function Test-Any {
param($EvaluateCondition)
process {
"Test-Any `$_: '$_'"
& $EvaluateCondition
}
}
} | Out-Null
1..2 | %{3..4 | Test-Any {"EvaluateCondition `$_:'$_'"}}
出力:
Test-Any $_: '3'
EvaluateCondition $_:'1'
Test-Any $_: '4'
EvaluateCondition $_:'1'
Test-Any $_: '3'
EvaluateCondition $_:'2'
Test-Any $_: '4'
EvaluateCondition $_:'2'
何らかの値が にバインドされたスクリプト ブロックを呼び出したい場合$_、これを行う 1 つの方法は次のとおりです。
ForEach-Object $EvaluateCondition -InputObject $ObjectToTest