Arrays PowerShell:将对象的ArrayList作为参数传递到另一个脚本中

Arrays PowerShell:将对象的ArrayList作为参数传递到另一个脚本中,arrays,powershell,arraylist,scripting,arguments,Arrays,Powershell,Arraylist,Scripting,Arguments,我试图将包含对象的ArrayList传递到另一个PowerShell脚本中,以进一步执行某些操作 我收到的错误消息是: 无法处理参数“al”的参数转换。无法将“System.Collections.Hashable System.Collections.Hashable System.Collections.Hashable”类型的“System.String”值转换为“System.Collections.ArrayList”类型 在script1.ps1中: $al = New-Object

我试图将包含对象的ArrayList传递到另一个PowerShell脚本中,以进一步执行某些操作

我收到的错误消息是:

无法处理参数“al”的参数转换。无法将“System.Collections.Hashable System.Collections.Hashable System.Collections.Hashable”类型的“System.String”值转换为“System.Collections.ArrayList”类型

在script1.ps1中:

$al = New-Object System.Collections.ArrayList

...

$obj =  @{"var1"="apple"; "var2"="banana"; "var3"="carrot";}
$al.Add($obj)

...


foreach ($i in $al) {
    $temp = $($i.var1)
    write-host "$temp"     #outputs "apple" correctly
}

invoke-expression -Command "script2.ps1 -al '$al'"
在script2.ps1中:

param ([System.Collections.ArrayList]$al)

...

foreach ($i in $al) {
    $temp = $($i.var1)
    write-host "$temp"     #error message
}

出于我不熟悉的原因,
Invoke Expression
正在将ArrayList转换为哈希表。如果在script2.ps1中确实需要ArrayList,可以将
$al
设置为全局变量(请参见下文)

更新的script1.ps1

$al=新对象System.Collections.ArrayList
$obj=@{“var1”=“苹果”;“var2”=“香蕉”;“var3”=“胡萝卜”;}
$al.添加($obj)
foreach($i,单位为$al){
$temp=$($i.var1)
写入主机“$temp”
}
$Global:al=$al
调用表达式-命令“$PSScriptRoot\script2.ps1”
更新的script2.ps1

param()
$Global:al.GetType().FullName
foreach($i,单位为$Global:al){
$temp=$($i.var1)
写入主机“$temp”
}

您在$obj中创建的是一个哈希表。没有必要为了您想要的内容而将其放入数组列表中。你应该能够做到这一点

在脚本1中

$obj=@{“var1”=“苹果”;“var2”=“香蕉”;“var3”=“胡萝卜”}
写入主机$obj[“var1”]
&\script2.ps1-ht$obj
脚本2

Param(
[哈希表]$ht
)
写入主机$ht[“var1”]
ArrayList不会用于键值配对

[System.Collections.ArrayList]$al=“苹果”、“香蕉”、“胡萝卜”
$al.添加(“橙色”)
部分问题是您不需要在变量周围添加引号,它正在将
$al
转换为字符串

&.\script2.ps1-al$al

一般来说,你应该决定什么最适合这份工作,一本字典还是一份清单。多年来到处都在讨论它。

$obj
正在创建一个哈希表,并将其添加到ArrayList中。@Ash,
$al
在被
调用表达式
使用时仍然是ArrayList。这可以通过将
$al.GetType().FullName
添加到调用script2.ps1`的行之前的行来验证这一点。然后,他通过将变量括在引号中将其转换为字符串,这导致了问题。事实上,这是可行的。我认为您仍然需要选择是否需要键/值配对,例如哈希表或字典,或者对象列表/数组。我不确定哈希表列表是否特别有用。在PoSh脚本之间传递结构化数据的一种非常简单的方法是使用一种结构化数据文件类型。JSON是最常被推荐的,但是
Export/Import-CliXml
cmdlet非常灵活地处理高级数据类型。因此,我将导出到一个CliXml文件&然后让另一个脚本导入该文件。这样,您只需要传递完整的文件名。[GRIN ]请考虑支持任何你觉得有用的答案,或者接受答案(通过复选框),如果它解决了你的问题。