You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:31:07