使用Invoke-Command将数组传递给另一个脚本

时间:2013-07-10 18:00:29

标签: arrays powershell invoke-command

我一直试图解决这个问题。我已经看过其他文章,并尝试了一切,但我没有得到任何地方。我试图将一个数组作为参数传递给另一个PS脚本。这是我正在尝试的:

$IPArray = Get-Content C:\ListofIps.txt
Invoke-Command -Computername $server -Credential $cred -FilePath "C:\script.ps1" -ArgumentList (,$IPArray)

$ IPArray中的5个值未传递给我调用的脚本。

先谢谢你们,伙计们,我非常感谢你们给予的任何帮助......

3 个答案:

答案 0 :(得分:11)

使用:

... -ArgumentList (,$IPArray)

因为ArgumentList参数需要一个数组,所以你已经正确地注意到你需要将数组包装在另一个数组中。但是,此方案中的正确语法(指定参数值)是使用分组表达式()来创建嵌套数组。

答案 1 :(得分:0)

这是一个老问题,但是我要在答案上重新迭代@keith-hill - 在数组声明的开头添加一个逗号(即使包含现有数组)。

这很愚蠢,但我再次回答是因为我尝试了所有替代方案,这是唯一有效的方法 - 即使使用PowerShell 3.0+也是如此。您可以使用#require来获取至少v3.0 +的任何内容,但除非您执行@ keith-hill建议的操作,否则一切都无法工作 - 即使它是一个数组,并且参数是一个数组, PS在这种情况下很糟糕(我喜欢PS)...做他说的话(发帖没有工作,很抱歉,但工作答案更好): \ ... -ArgumentList (,$IPArray)

这没有任何意义,但这有效。向PS团队请求放弃炸弹,但如果我没有这样做,我的剧本将是无效的。而且我已经成为了#34;脚本专家......所以你走了。

答案 2 :(得分:0)

如果你只是想传递一个数组,你可以把 $args 变量本身当作远程命令中的数组,你得到的结果与将它传递为 (, $IPArray) 然后在脚本块作为 $args[0]。我没有测试这是否适用于多个数组。

也就是说,

$MyScriptBlock = { $args | % { Do-Stuff -Thing $PSItem } }
Invoke-Command -Session $MySession -ScriptBlock $MyScriptBlock -ArgumentList $IPArray

将返回与

相同的值
$MyScriptBlock = { $args[0] | % { Do-Stuff -Thing $PSItem } }
Invoke-Command -Session $MySession -ScriptBlock $MyScriptBlock -ArgumentList (,$IPArray)