PowerShell模块外部调用自定义类型参数函数报错原因咨询
PowerShell跨模块自定义类型不匹配问题解析
问题根源
PowerShell里的自定义类是绑定到模块作用域的——哪怕名字、结构完全一样,模块内部定义的类和外部脚本里定义的类,会被当成两个完全不同的类型。这是因为PowerShell给每个自定义类型加了加载上下文标记(比如所属模块),只要加载的作用域不一样,类型的唯一标识就不同。
你在ExportHelper.psm1里定义的Text类,和外部脚本Playings.ps1里自己构造的Text对象,根本不是一个类型。模块里的Add-Text函数要求的参数是模块内的Text类型,外部传的是脚本作用域里的Text类型,自然会报“无法转换”的错。而模块内部调用时,类和函数在同一个作用域,类型完全匹配,所以没问题。
解决办法
方法1:从模块导出自定义类(推荐)
在ExportHelper.psm1里,把Text类和Add-Text函数一起导出:
# ExportHelper.psm1 末尾添加导出语句 Export-ModuleMember -Function Add-Text -Type Text
然后在Playings.ps1里,直接用模块导出的Text类创建对象,不要再自己定义一遍:
# Playings.ps1 Import-Module .\ExportHelper.psm1 -Force $textObj = [Text]::new(...) # 这里用的是模块里导出的Text类 Add-Text -InputObject $textObj
方法2:删除外部脚本中的重复类定义
如果你之前在Playings.ps1里自己定义了Text类,必须删掉,否则PowerShell会优先用脚本作用域里的类,还是会出现类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Hester
相关产品推荐
相关产品推荐

