powershell 如何从短名称中得到完整的类型名称,反之亦然?

bq9c1y66  于 2023-03-02  发布在  Shell
关注(0)|答案(1)|浏览(107)

如果我有对象类型的短名称(例如:PSCredential、String等)我需要获取完整的类型名称(例如:系统、管理、自动化、PSCredential、系统、字符串等),反之亦然。
我认为这会像使用Get-TypeData一样简单,但是由于一些奇怪的原因,该命令对PSCredential和ServiceController等类型返回信息,而对String、Int32、Boolean等基本类型则什么也不返回。
有人知道怎么做吗?

2w3rbyxf

2w3rbyxf1#

可以通过调用类型的.FullName属性来获取类型的完全限定名,即:

[pscredential].FullName # => System.Management.Automation.PSCredential

从完全限定名到.Name,可以将字符串转换为[type]

([type] 'System.Management.Automation.PSCredential').Name # => PSCredential

如果您想查看他们的accelerator name,即:bool而不是Boolean(假设他们有一个),您可以使用以下命令:

$accelerators = @{}
[PowerShell].Assembly.GetType('System.Management.Automation.TypeAccelerators')::Get.GetEnumerator() |
    ForEach-Object { $accelerators[$_.Value.FullName] = $_.Key }

然后您可以:

$accelerators['System.Boolean'] # => bool

上述方法在某些情况下肯定会失败,正如OP在注解中所指出的,在尝试[type] 'Process'时,以下方法应该可以在这种情况下工作:

$map = @{}
[System.AppDomain]::CurrentDomain.GetAssemblies() |
    ForEach-Object { try { $_.GetExportedTypes() } catch { } } |
    ForEach-Object {
        $map[$_.Name] = $_.FullName
        $map[$_.FullName] = $_.Name
    }

$map['Process'] # => System.Diagnostics.Process
$map['System.Diagnostics.Process'] # => 'Process'

相关问题