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 }

执行这个脚本并打印出来:谢谢,但这似乎不起作用,我有 PS 4.0 和

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

这很奇怪!一个脚本自己打印出来!我有 PS4.0 并正在运行 ISE。这是为什么?

4

2 回答 2

1

您正在尝试执行脚本块 10 次,但您尝试将数组从 1 传递到 10。您应该将该数组传递给foreach-object

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 回答