2013-10-24 157 views
6

编辑:我在这里已经改变了代码,以一个简单的测试用例,而不是在那里这个问题所带来的全面实施。PowerShell脚本参数传递的数组

我试图从另一个调用一个PowerShell脚本,但事情不工作了,我很期待。据我了解的东西,在“&”运营商应该扩大阵列分成不同的参数。这不会发生在我身上。

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: 

我认为概率LEM我遇到的$scriptargs数组未展开,并作为参数传递相当。我使用PowerShell的2

我怎样才能得到caller.ps1与参数数组运行callee.ps1?

+0

我还应该在这里注意到,我使用了PowerShell社区扩展的EchoArgs实用程序,并且参数显示为格式正确。 – Sam

+0

您将部署参数定义为数组您是否尝试将该字符串作为表达式调用 – rerun

+0

我试图将参数构建为[本博客文章]上看到的数组(http://edgylogic.com/blog/powershell- and-external-commands-done-right /)标题下的“但是如果我想构建参数来传递我的脚本呢?” – Sam

回答

9

当调用本机命令,像& $program $programargs通话将正确逃生的参数数组等等它被可执行文件正确解析。但是,对于PowerShell cmdlet,脚本或函数,不存在需要序列化/解析往返的外部编程,因此数组作为单个值按原样传递。

相反,可以使用splatting到阵列的元件(或散列表)传递到脚本:

& $scriptfile @scriptargs 

& $scriptfile @scriptargs@使值$scriptargs要被施加到的参数剧本。

+0

啊..溅溅..谢谢。 – sonjz

+2

请注意,splatting需要PowerShell 3.0或更高版本。 – Sam

+1

@Sam:MS至少说2.0 - > https://technet.microsoft.com/en-us/library/jj672955.aspx – Sebastian

1

你传递的变量作为一个对象,你需要OT单独通过他们。

这这里工作:

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

那么,这是否:

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

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

如果你需要把它作为一个单一的对象,像一个数组,那么你可以有被叫脚本拆呢;具体代码将取决于您传递的数据类型。

1

使用调用-表达的cmdlet:

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

其结果是,你会得到:

PS > Invoke-Expression ".\callee.ps1 $scriptargs" 
Parameter one: a 
Parameter two: b 
Parameter three: c 
PS > 
+0

这可以工作,添加有利于您在设计时不需要知道参数将会是什么(或其中有多少)。 – Sam

+3

Invoke-Expression引用的参数有很多痛苦的错误,也可能是安全漏洞(如果您不仔细检查输入)。 –

+0

我肯定更喜欢Emperor XLIIs解决方案。 – mzedeler