由于我需要能够从数组中添加和删除项目,因此我需要将其转换为ArrayList
与更常见的选项(、、、[string[]]
)[Array]
相反的值$Var=@()
。我还需要用数据对其进行预设,但函数的调用者需要能够根据需要更改预设。块中的预设Param()
是必需的,因为另一个实体正在寻找预设数据。我尝试了几种变体,但这是最有意义的一种:
Function Test-Me{
Param
(
$Properties = [System.Collection.ArrayList]@(
"red",
"blue",
"green")
)
$Properties.GetType()
$Properties.Add("orange")
}
上面的内容很好,只是一旦有人调用Test-Me -Properties "Purple","Yellow","Black"
该$Properties
变量就成为标准Array
类型(因此添加和删除方法不起作用)。
我尝试了更改我声明预设值的方式的方法。似乎预填充的行为是将类型转换为常规数组。我认为这是因为我使用@()
的是预设,所以我也尝试()
过。
这也不起作用:
Param
(
[System.Collection.ArrayList]
$Properties = @("red",
"blue",
"green")
)
我有一个解决方法可以转换 Param 块之外的类型,它看起来像这样:
Function Test-Me{
Param
(
[String[]]
$Properties = @("red",
"blue",
"green")
)
if("Orange" -notin $Properties){
[System.Collections.ArrayList]$Properties = $Properties
$Properties.Add("orange")
}
}
我觉得我应该能够ArrayList
在 param 块中转换为 an 并用数据预设它,并以相同的 datatype 返回,但我想不通。如果有人这样做,或者找到了为什么它不起作用的文档,请回答。
显式参数类型转换
您发布的第二个示例(显式转换参数变量)是正确的方法:
导致:
输出类型
不过,让我感到惊讶的一件事是,即使使用该
[OutputType]
属性,该函数也会输出一个常规数组(这实际上可能是一个错误预期的行为,请参阅下面的更新):仍然导致返回一个常规对象数组:
更新(使用简单的解决方法)
正如您对Connect 错误提交的评论中所展示的那样,PowerShell 故意枚举任何可枚举输出的项目,以便为管道提供一致的行为(从评论者 Derp McDerp 在 Connect 上窃取的伪 C#):
然后诀窍是将集合包装在一个单项数组中,导致 PowerShell 将其作为单个项进行管道传输(注意
,
before$Properties
):现在,我们得到了正确类型的输出:
一位同事只是要我解释一些与此相关的细节,所以我认为与将来带着这个问题来这里的其他人分享一些补充信息可能是有益的。
在 PowerShell 中,可以通过三种基本方式为变量赋值:
如果要确保变量(或函数参数)是特定类型,则必须使用强类型,就像使用
$myVariable3
. 这样做可以防止类型意外更改为其他内容(例如$myVariable3 = 42
,将因错误而失败)。知道您可以使用
Get-Variable
cmdlet 识别变量何时为强类型是很有用的。例如,调用Get-Variable myVariable1,myVariable2,myVariable3 | Format-List Name,Value,Visibility,Options,Attributes
会产生以下输出:myVariable3
请注意,除了变量在属性中具有属性之外,这些都是相同的Attributes
。AnArgumentTypeConverterAttribute
被添加到任何强类型的变量中,并且该属性将确保变量保持相同的类型,无论您将其分配给什么。了解变量赋值的工作原理,以及如何像 Mathias上面指出的那样完整地返回集合,可以更轻松地在 PowerShell 中处理数据。