开发者问题收集

如何测试(可能的)未知类型?

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