在Module中使用时,函数不会获得绑定

问题描述 投票:3回答:1

我想把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会发生这种情况。

powershell module powershell-v4.0 powershell-module
1个回答
4
投票

那个命令:& $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
© www.soinside.com 2019 - 2024. All rights reserved.