如何测试(可能的)未知类型?
2019-09-05
414
PowerShell Core
似乎具有
语义版本控制
,其中包括一个名为
[semver]
的新类型加速器,并基于
System.Management.Automation.SemanticVersion
类。
要在 PowerShell 中测试此特定类型核心环境中,您可能会使用以下语法:
$PSVersionTable.PSVersion -is [semver]
但是,如果您在脚本中实现此操作并在 Windows PowerShell 环境中运行此操作,则会收到错误:
Unable to find type [semver]. At line:1 char:31 + $PSVersionTable.PSVersion -is [semver] + ~~~~~~~~ + CategoryInfo : InvalidOperation: (semver:TypeName) [], RuntimeException + FullyQualifiedErrorId : TypeNotFound
当我将其与类型名称 (
string
) 进行比较时,会出现类似的错误:
$PSVersionTable.PSVersion -is `semver`
Cannot convert the "semver" value of type "System.String" to type "System.Type". At line:1 char:1 + $PSVersionTable.PSVersion -is 'semver' + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException
(如果 PowerShell 区分提供
[Type]
或
'String'
作为比较,并且如果字符串无法匹配,则仅返回
$False
,那就太好了/正确了转换)
测试类型并防止在类型未知时出现任何错误的最佳方法是什么(就像在特定环境中对某些类型的
-is
运算符所发生的情况一样)?
2个回答
感谢
vexx32
提供的此答案:
(另请参阅:
功能请求:-Is 运算符:抑制“无法转换”错误 #10504
)
'UnknownType' -as [type] -and $object -is [UnknownType]
例如:
'semver' -as [type] -and $PSVersionTable.PSVersion -is [semver]
iRon
2019-09-11
到目前为止,我能想到的最佳答案是:
$Object.PSTypeNames -Contains '.NET Framework type'
例如:
$PSVersionTable.PSVersion.PSTypeNames -Contains 'System.Management.Automation.SemanticVersion'
但这将使使用 类型加速器 变得不可能。
iRon
2019-09-05