PowerShell中如何实现对象类型短名称与完整名称互转?
PowerShell 类型短名称与完整类型名互转方案
一、短名称转完整类型名
不管是String、Int32这类基础.NET类型,还是PSCredential、ServiceController这类PowerShell特定类型,都可以直接通过类型对象的FullName属性获取完整类型名——Get-TypeData仅存储扩展类型数据,不包含基础类型的别名映射,所以不用依赖它。
示例代码:
# 基础类型转换 [String].FullName # 返回 System.String [Int32].FullName # 返回 System.Int32 [Boolean].FullName # 返回 System.Boolean # PowerShell特定类型转换 [PSCredential].FullName # 返回 System.Management.Automation.PSCredential [ServiceController].FullName # 返回 System.ServiceProcess.ServiceController
如果需要处理字符串形式的短名称(比如用户输入的"String"),可以通过动态解析类型实现(注意:若输入来源不可信,避免使用Invoke-Expression,可改用[Type]::GetType()结合PowerShell类型解析逻辑):
$shortTypeName = "PSCredential" $type = Invoke-Expression "[$shortTypeName]" $type.FullName
二、完整类型名转短名称
需要覆盖PowerShell内置的类型加速器,以及可能存在的自定义类型别名两种场景:
方法1:查询内置类型加速器
PowerShell内置的类型加速器存储在[System.Management.Automation.TypeAccelerators]类中,可反向查找对应的短名称:
function Get-ShortTypeName { param( [Parameter(Mandatory=$true)] [string]$FullTypeName ) # 获取所有内置类型加速器的键值对 $accelerators = [System.Management.Automation.TypeAccelerators]::Get.GetEnumerator() # 匹配完整类型名并返回短名称 $match = $accelerators | Where-Object { $_.Value.FullName -eq $FullTypeName } if ($match) { return $match.Key } # 无匹配加速器时,返回类型本身的短名称 return ([Type]$FullTypeName).Name } # 调用示例 Get-ShortTypeName "System.String" # 返回 String Get-ShortTypeName "System.Management.Automation.PSCredential" # 返回 PSCredential Get-ShortTypeName "System.Int32" # 返回 Int32
方法2:包含自定义类型别名的查询
如果系统中存在通过Update-TypeData添加的自定义类型别名,需要结合Get-TypeData补充查询:
function Get-ShortTypeName { param( [Parameter(Mandatory=$true)] [string]$FullTypeName ) # 优先查询内置类型加速器 $accelerators = [System.Management.Automation.TypeAccelerators]::Get.GetEnumerator() $match = $accelerators | Where-Object { $_.Value.FullName -eq $FullTypeName } if ($match) { return $match.Key } # 再查询自定义类型数据中的别名 $typeData = Get-TypeData -TypeName $FullTypeName if ($typeData) { return $typeData.TypeName.Name } # 无匹配时返回类型本身的短名称 return ([Type]$FullTypeName).Name }
补充说明
Get-TypeData仅返回PowerShell为现有类型添加的扩展数据(如自定义属性、方法),不包含基础.NET类型的别名映射,因此无法用来查询String、Int32这类类型的信息。- 类型加速器是PowerShell为简化输入设计的内置别名,大部分常用.NET类型都有对应加速器,直接通过
[短名称]即可访问对应类型。
内容的提问来源于stack exchange,提问作者jerdub1993
相关产品推荐
相关产品推荐

