函数在模块中使用时没有绑定
Function does not get binding when used in Module
我正在尝试将 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 }
returns 中的函数,则为 false,因为 $_
未设置为管道中的值。
如果我在脚本中正常定义函数并从那里使用它,它会按预期工作($_ 被分配整数值)。
Windows 7.
下的 PowerShell v4.0 会发生这种情况
该命令:& $EvaluateCondition $ObjectToTest
— 不将任何内容绑定到 $_
。如果 ScriptBlock
中没有 param()
块,$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
我正在尝试将 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 }
returns 中的函数,则为 false,因为 $_
未设置为管道中的值。
如果我在脚本中正常定义函数并从那里使用它,它会按预期工作($_ 被分配整数值)。
Windows 7.
下的 PowerShell v4.0 会发生这种情况该命令:& $EvaluateCondition $ObjectToTest
— 不将任何内容绑定到 $_
。如果 ScriptBlock
中没有 param()
块,$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