编辑:我已将此处的代码更改为一个简单的测试用例,而不是出现此问题的完整实现。
我试图从另一个脚本中调用一个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?
答案 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 >