4

複数のscriptblockパラメーターを受け入れるPowershell関数を作成できませんでした。これが簡略化されたテストスクリプトです。複数のスクリプトブロックの問題は何ですか?

function Task1 {
    param([scriptblock]$f={})

    $f.Invoke()
}

function Task2 {
    param([scriptblock]$f={}, [scriptblock]$k={})

    $f.Invoke()
    $k.Invoke()
}

Task1({write-host "hello" -nonewline })
Task1({write-host " world" })
Task2({write-host "hello" -nonewline }, { write-host " world" })

これにより、次の出力が生成されます。

hello world
Task3 : Cannot process argument transformation on parameter 'f'. Cannot convert the "System.Object[]" value of type "S
ystem.Object[]" to type "System.Management.Automation.ScriptBlock".
4

2 に答える 2

10

問題は、関数を呼び出すときに括弧とコンマを使用していることです。これは、PowerShellでよくある間違いです。

これらは機能するはずです:

Task1 {write-host "hello" -nonewline } 
Task1 {write-host " world" }
Task2 {write-host "hello" -nonewline }  { write-host " world" }
于 2011-04-25T23:08:38.523 に答える
3

PowerShell呼び出し演算子「&」を使用してスクリプトブロックを呼び出すこともできます。別の方法として、型情報とそのパラメーターの初期化を削除しました。スクリプトブロックが渡されなかった場合、これにより異なるエラーが発生します。

function Task1 {
    param($f)

    & $f
}

function Task2 {
    param($f,$k)

    & $f
    & $k
}

Task1 {write-host "hello" -nonewline }
Task1 {write-host " world" }
Task2 {write-host "hello" -nonewline } { write-host " world" }
于 2011-04-26T00:15:02.757 に答える