0

「Write-Host mm」をスクリプトブロックとして関数「f」に渡したいのですが、「f」がそれを10回実行することを願っているので、試しました:

    function f([ScriptBlock]$s)
    {
        1..10|$s
    }
    f(Write-Host mm)

残念ながら、powershell はエラーを出します:

    At C:\Users\engineer\Documents\Untitled1.ps1:3 char:11
    +     1..10|$s
    +           ~~
    Expressions are only allowed as the first element of a pipeline.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpressionsMustBeFirstInPipeline
    How to correct my script?

ジェイソンの最初の回答に感謝しますが、うまくいかないようです:ありがとう、しかしこれはうまくいかないようです、私は PS 4.0 を持っています

function f([ScriptBlock]$s)
{
    1..10 | & $s
}
f { Write-Host mm }

このスクリプトを実行すると、次のように出力されます。

d:\ > function f([ScriptBlock]$s)
{
    1..10 | & $s
}
f { Write-Host mm }
mm

変ですね!スクリプト自体が出力されます。PS4.0 と ISE を実行しています。何故ですか?

4

2 に答える 2

1

You are trying to execute your scriptblock 10 times, but instead you try to pipe in an array from 1 to 10. You should pipe that array to foreach-object instead.

function f([ScriptBlock]$s)
{
    1..10 | % {& $s}
    # % is an alias for Foreach-Object
}
f { Write-Host mm }
于 2015-06-29T06:39:44.580 に答える
0

呼び出し演算子 & を使用する必要があります。また、スクリプト ブロックは中かっこで囲まれているため、例は次のようになります。

function f([ScriptBlock]$s)
{
    1..10 | & $s
}
f { Write-Host mm }

C# メソッドのように PowerShell 関数を呼び出さないことに注意してください。引数を括弧で囲んだり、引数の間にスペースを入れてコマンドのように PowerShell 関数を呼び出したりします。

于 2015-06-29T03:42:09.503 に答える