PowerShell 5 和类 - 无法将“X”类型的“X”值转换为“X”类型

Eug*_*kov 8 powershell class powershell-5.0

我正在尝试使用 PowerShell 的类,这是一种非常方便的将相关数据分组在一起的方法,并且在处理行为方面非常繁琐。简化方案:一个定义类的 PS 脚本和另一个使用该类的脚本。

通用.ps1

class X
{
    [string] $A
} 
Run Code Online (Sandbox Code Playgroud)

脚本1.ps1

. $PSScriptRoot\Common.ps1

[X] $v = New-Object X
Run Code Online (Sandbox Code Playgroud)

一切都很好-你可以运行Script1.ps1没有问题的次任意数量的-直到你做出任何的改变Common.ps1。您将面临以下错误。

无法将“X”类型的“X”值转换为“X”类型。
在 D:\temp\PSIssue\Script1.ps1:3 字符:1
+ [X] $v = 新对象 X
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
    + FullQualifiedErrorId:运行时异常

可以想象,PS 文件中的任何更改(即使您只是添加了空格)都会强制其重新编译,因此该类型X变得与以前不同X- 临时容器程序集已更改(同样的问题在 .NET 中很容易重现 - 类型与只要“完全限定的程序集名称”相同)。变化Script1.ps1使事情恢复正常。

有没有办法克服这类问题?

Ama*_*rma 6

我能够复制并解决您的问题。这类似于您在某个范围内定义一个类,然后尝试在同一范围内定义另一个类。类定义保留在 PowerShell 会话中。在 Script1.ps1 中,您需要修改代码以不显式声明要键入的变量。只需按如下方式使用即可不使用强类型,并让 PowerShell 确定类型并动态分配它:

. $PSScriptRoot\Common.ps1

$v = New-Object X
Run Code Online (Sandbox Code Playgroud)

现在您应该能够根据需要多次更改 Common.ps1 中类 X 的定义,而无需关闭和重新加载。

上面的示例使用“弱类型”您可以在此处阅读有关此内容和其他详细信息的更多信息:变量类型和强类型