Arrays 使用Invoke命令将数组传递给另一个脚本

Arrays 使用Invoke命令将数组传递给另一个脚本,arrays,powershell,invoke-command,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个值没有传递给我调用的脚本 提前谢谢,

我一直想弄清楚这件事。我看过其他的文章,尝试了所有的方法,但我没有取得任何进展。我试图将数组作为参数传递给另一个PS脚本。以下是我正在尝试的:

$IPArray = Get-Content C:\ListofIps.txt
Invoke-Command -Computername $server -Credential $cred -FilePath "C:\script.ps1" -ArgumentList (,$IPArray)
$IPArray中的5个值没有传递给我调用的脚本

提前谢谢,伙计们,我真的很感谢你们能提供的任何帮助…

使用:

... -ArgumentList (,$IPArray)

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

这是一个老问题,但我将在答案上重复@keith hill——在数组声明的开头添加逗号(即使包括现有数组)

这很愚蠢,但我再次回答,因为我尝试了所有替代方案,这是唯一有效的方法——即使使用PowerShell 3.0+。你可以使用
#require
至少从v3.0+开始,但除非你按照@keith hill的建议去做,否则一切都不会起作用——即使它是一个数组,参数是一个数组,PS在这种情况下很糟糕(我喜欢PS)…照他说的做(发帖不起作用,很抱歉,工作答案更好): \
-ArgumentList(,$IPArray)


这毫无意义,但这是可行的。这是PS团队在这一点上投下的炸弹,但如果我没有这样做,我的脚本将是无效的。我已经成为了“脚本编写人员”…现在开始吧。

如果您只是想传递一个数组,您可以将$args变量本身视为远程命令中的数组,得到的结果与将其作为(,$IPArray)传递,然后在scriptblock中作为$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)

为什么$IPArray前面有逗号,为什么要把它放在括号里?如果您只想将$IPArray作为参数列表传递,请使用
-ArgumentList$IPArray
。谢谢您的快速回复,Adi。根据,括号和逗号是-ArgumentList将参数视为数组所必需的。但是,我尝试了两种方法,但都没有成功。script.ps1是否有param()语句来接受参数?尝试将以下内容放入$server上的test.ps1文件中进行测试:param([string[]$IPs)$IPS |编写输出,至少应该告诉您目标脚本是否正确地传递和接受了参数。看起来就是这样,JBSmith!我之前尝试过param语句,但没有意识到它必须是第二个脚本中的第一个可执行行。这是我需要的,但我甚至应该传递参数吗$IPArray作为-ArgumentType?调用test.ps1脚本时,它不应该作为全局变量在作用域中吗?$IPArray在当前本地会话的全局作用域中。但是,当运行Invoke命令时,您正在远程计算机上启动一个新的新会话。该计算机没有任何局部变量、函数、模块等在powershell版本3中,有一个名为using的新变量“scope”,它可以将本地变量传递给远程会话。因此,您可以在脚本中这样指定变量:“$using:IPArray”。但在版本2中,必须使用-ArgumentList将本地变量获取到远程计算机。如果使用
@($IPArray)
@()
对数组没有任何作用,则不需要使用第一个逗号。也就是说,如果
@()
是一个标量,然后该标量被放入数组中,但如果内容已经是一个数组,则该数组不会被包装在另一个数组中。有趣的是,我不知道。谢谢。我真的很想编辑它,但老实说,您的修复不起作用……可能对您有效,但对其他所有人无效。不过,我很想听听您的问题……这是个问题不是很愚蠢。发生的事情是,
-ArgumentList
默认情况下获取一个数组,并将项目分散到调用的命令中的参数:
调用命令-ScriptBlock{param($x,$y,$z)…}-ArgumentList(1,2,3)
将$x设置为1,$y设置为2$y,$z设置为3。因此,
-ArgumentList
已经有了特殊的数组处理;它基本上就是这样工作的。当您传入自己的数组时,它无法分辨您的数组和(例如,
(1,2,3)
,因此它会获取并分发数组项。
(,$x)
语法使其获得一个包含1个元素的数组,该元素就是您的数组。