PowerShell脚本参数作为数组传递

时间:2013-10-24 18:33:13

标签: powershell

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

我试图从另一个脚本中调用一个Powershell脚本,但事情并没有像我期望的那样成功。据我所知,“&” operator应该将数组扩展为不同的参数。那不是我的事。

caller.ps1

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

& $scriptfile $scriptargs

callee.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?

3 个答案:

答案 0 :(得分:10)

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

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

& $scriptfile @scriptargs

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

答案 1 :(得分:1)

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

这在这里有效:

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

这样做:

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

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

如果你需要将它作为单个对象传递,就像数组一样,那么你可以让被调用脚本分割它;具体的代码取决于你传递的数据类型。

答案 2 :(得分: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 >