该命令:& $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'
如果您想调用绑定到某个值的脚本块$_
,那么执行此操作的一种方法是:
ForEach-Object $EvaluateCondition -InputObject $ObjectToTest