我想使用泛型集合作为PowerShell函数的参数类型,如下所示:
function Execute-Tokenlist
{
param([System.Collections.Generic.List[WTToken]]$Tokenlist)
}
[WTToken]只是一种自定义类型。
我使用WTToken对象创建一个新的通用集合列表:
$TokenList1 = New-Object -TypeName System.Collections.Generic.List[WTToken]
但是当我尝试调用函数
时Execute-Tokenlist -Tokenlist $TokenList1
结果是ParameterBindingArgumentTransformationException,因为PowerShell将System.Collections.Generic.List`1 [WTToken]转换为新类型:
System.Collections.Generic.List`1 [[WTToken,TokenListeAuswerten.ps1,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null]]
因此,它将脚本名称作为程序集名称添加到类型名称中。
我的问题是:如何防止PowerShell进行这种类型转换?
我知道我可以使用Object作为参数类型,但我不想放弃类型检查,没有充分的理由。
答案 0 :(得分:0)
我找到了解决方案,(当然)它有一个简单的解释。
Powershell包含基于类定义的任何类型的全名,包含类定义的Ps1文件的路径,或者如果定义不在ps1文件中,则包含“\ powershell”。
我的错误是我在ISE中打开一个新的脚本窗口并输入用于定义类的代码。
然后我尝试将基于该类的对象放在已经在ps1文件中定义的泛型集合中,并且具有一个Add方法,该方法使用包含ps1文件的类型来感知对象。由于新的对象类型名称不包含该ps1路径,因此我收到了对我没有意义的错误消息(现在确实如此)。
以下是完整的PowerShell脚本代码:
class WTToken
{
[String]$Type
[String]$Name
[Bool]$Value
}
$TokenList = [System.Collections.Generic.List[WTToken]]::new()
$Token = [WTToken]::new()
$TokenList.Add($Token)
$TokenList.GetType().FullName
启动ISE,粘贴该代码并将其保存到ps1文件中,例如。 test.ps1并使用F5运行它。
现在打开一个新的脚本窗口并粘贴以下Powershell代码:
class WTToken
{
[String]$Type
[String]$Name
[Bool]$Value
}
$Token = [WTToken]::new()
$TokenList.Add($Token)
运行此命令并显示错误消息。