我在将数组成员传递到另一个脚本时遇到问题。我有一个从CSV提取的VM构建脚本,最终得到了一个带有.Name,.CPU,.RAM,.IP等的$ VM对象。我想将该VM对象传递给另一个脚本(在新服务器内部) ),然后可以对其执行操作,但无法执行此操作。我一直在测试正确的语法,只是为了传递一个简单的数组,如下所示,但仍然不成功:
CSV:
Name,NumCPU,MemoryGB,IPAddress
JLTest01,2,4,172.24.16.25
脚本1:
Function TestMe {
[CmdLetBinding()]
Param (
[Parameter(Mandatory, Position=1)]
[array]$arr
)
$arr | Out-GridView
}
TestMe
调用脚本:
$aVMs = Import-Csv -Path "PathToCsv"
foreach($VM in $aVMs) {
$command = "<path>\TestMe.ps1 " + "-arr $($VM)"
Invoke-Expression $command
}
这会产生错误,似乎是在解析数组时出现的。错误状态:
术语'JLTest01'不被识别为cmdlet,函数,脚本文件或可运行程序的名称。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。 在第1行:char:48 + ... \ Desktop \ TestMe.ps1 -arr @ {Name = JLTest01; NumCPU ...
只是试图弄清楚我到底在做什么错,以及将对象传递给第二个脚本所需要做的事情。
答案 0 :(得分:1)
请勿使用Invoke-Expression
(很少是正确的工具和should generally be avoided for security reasons):
由Import-Csv
执行的$($VM)
输出的自定义对象的字符串化不会保留原始对象。它会导致类似于哈希表的 表示形式,该表示形式不适用于编程处理,并且会破坏您传递给Invoke-Expression
的命令行的语法。
相反,只需直接调用脚本即可:
$aVMs = Import-Csv -Path "PathToCsv"
.\TestMe.ps1 -arr $aVMs
请注意,鉴于您的$aVMs
参数是数组类型的,因此我将整个-arr
传递给您的脚本。
如果您希望一个接一个地处理对象,请坚持使用foreach
方法(但随后应将$arr
参数的类型声明为[pscustomobject]
而不是{{ 1}}):
[array]
另一种选择是声明$aVMs = Import-Csv -Path "PathToCsv"
foreach ($VM in $aVMs) {
.\TestMe.ps1 -arr $VMs
}
为接受管道输入,在脚本中添加$arr
块,然后在脚本中添加 pipe process
({ {1}}。
此外,请勿在脚本中调用的$aVMs
脚本中嵌套相同名称的函数,尤其是在不传递参数的情况下;脚本可以像函数一样直接声明参数:
$aVMs | .\TestMe.ps1