3

私はこの機能を入れようとしています:

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 で発生します。

4

1 に答える 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'

何らかの値が にバインドされたスクリプト ブロックを呼び出したい場合$_、これを行う 1 つの方法は次のとおりです。

ForEach-Object $EvaluateCondition -InputObject $ObjectToTest
于 2015-10-20T15:14:27.743 に答える