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使事情恢复正常。
有没有办法克服这类问题?
我能够复制并解决您的问题。这类似于您在某个范围内定义一个类,然后尝试在同一范围内定义另一个类。类定义保留在 PowerShell 会话中。在 Script1.ps1 中,您需要修改代码以不显式声明要键入的变量。只需按如下方式使用即可不使用强类型,并让 PowerShell 确定类型并动态分配它:
. $PSScriptRoot\Common.ps1
$v = New-Object X
Run Code Online (Sandbox Code Playgroud)
现在您应该能够根据需要多次更改 Common.ps1 中类 X 的定义,而无需关闭和重新加载。
上面的示例使用“弱类型”您可以在此处阅读有关此内容和其他详细信息的更多信息:变量类型和强类型