8

编辑:我已将此处的代码更改为一个简单的测试用例,而不是出现此问题的完整实现。

我正在尝试从另一个调用一个 Powershell 脚本,但事情并没有像我预期的那样进行。据我了解,“&”运算符应该将数组扩展为不同的参数。这不会发生在我身上。

调用者.ps1

$scriptfile = ".\callee.ps1"
$scriptargs = @(
    "a",
    "b",
    "c"
)

& $scriptfile $scriptargs

被调用者.ps1

Param (
    [string]$one,
    [string]$two,
    [string]$three
)

"Parameter one:   $one"
"Parameter two:   $two"
"Parameter three: $three"

运行.\caller.ps1结果如下:

Parameter one:   a b c
Parameter two:
Parameter three:

我认为我遇到的问题是 $scriptargs数组没有扩展,而是作为参数传递。我正在使用 PowerShell 2。

如何让 caller.ps1 使用一组参数运行 callee.ps1?

4

3 回答 3

12

调用本机命令时,调用 like& $program $programargs将正确转义参数数组,以便可执行文件正确解析它。但是,对于 PowerShell cmdlet、脚本或函数,没有需要序列化/解析往返的外部编程,因此数组按原样作为单个值传递。

相反,您可以使用splatting将数组(或哈希表)的元素传递给脚本:

& $scriptfile @scriptargs

@in& $scriptfile @scriptargs导致将值 in应用于$scriptargs脚本的参数。

于 2013-11-03T23:57:59.917 回答
1

使用 Invoke-Expression cmdlet:

Invoke-Expression ".\callee.ps1 $scriptargs"

结果你会得到:

PS > Invoke-Expression ".\callee.ps1 $scriptargs"
Parameter one:   a
Parameter two:   b
Parameter three: c
PS >
于 2013-10-25T04:42:57.647 回答
1

您将变量作为单个对象传递,您需要独立传递它们。

这在这里有效:

$scriptfile = ".\callee.ps1"
& $scriptfile a b c

这样做也是如此:

$scriptfile = ".\callee.ps1"
$scriptargs = @(
    "a",
    "b",
    "c"
)

& $scriptfile $scriptargs[0] $scriptargs[1] $scriptargs[2]

如果您需要将其作为单个对象(如数组)传递,则可以让被调用者脚本拆分它;具体代码取决于您传递的数据类型。

于 2013-10-24T23:21:35.247 回答