将对象从一个脚本传递到另一个

时间:2019-05-10 18:37:50

标签: powershell

我在将数组成员传递到另一个脚本时遇到问题。我有一个从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 ...

只是试图弄清楚我到底在做什么错,以及将对象传递给第二个脚本所需要做的事情。

1 个答案:

答案 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