我想把this function:
function Test-Any {
[CmdletBinding()]
param($EvaluateCondition,
[Parameter(ValueFromPipeline = $true)] $ObjectToTest)
begin {
$any = $false
}
process {
if (-not $any -and (& $EvaluateCondition $ObjectToTest)) {
$any = $true
}
}
end {
$any
}
}
进入一个模块。我刚刚创建了一个新模块my-scripts.psm1文件,它只包含上面的函数并用Import-Module <absolute path>
导入它。
问题是,如果我使用模块中的函数1..4 | Test-Any { $_ -gt 3 }
返回false,因为$_
未设置为来自管道的值。
如果我在脚本中正常定义函数并从那里使用它,它按预期工作(使用$ _获取整数值)。
在Windows 7下使用PowerShell v4.0会发生这种情况。
那个命令:& $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