PowerShell 技能连载 - 简化 .NET 类型
适用于 PowerShell 所有版本
PowerShell 为多数常见的 .NET 类型定义了一个短名字。要查看已有多少个 .NET 类型定义了短名称,请使用以下代码:
PS> [System.Management.Automation.LanguagePrimitives]::ConvertTypeNameToPSTypeName("System.String")
[string]
PS> [System.Management.Automation.LanguagePrimitives]::ConvertTypeNameToPSTypeName("System.Int32")
[int]
PS> [System.Management.Automation.LanguagePrimitives]::ConvertTypeNameToPSTypeName("System.Management.ManagementObject")
[wmi]
PS> [System.Management.Automation.LanguagePrimitives]::ConvertTypeNameToPSTypeName("System.DirectoryServices.DirectoryEntry")
[adsi]
PS>
要查用另一种方法看真实的 .NET 名称,请使用以下方法:
PS> [string].FullName
System.String
PS> [int].FullName
System.Int32
PS> [wmi].FullName
System.Management.ManagementObject
PS> [adsi].FullName
System.DirectoryServices.DirectoryEntry
PS>
通过这个技巧,您还可以更好地理解 PowerShell 转换数据类型的机制:
PS> [System.Management.Automation.LanguagePrimitives]::ConvertTypeNameToPSTypeName("UInt8")
[Byte]
PS>
这表明了,当 PowerShell 遇到一个无符号 8 位整型数值,将自动把它转换为一个 Byte 数据。整个魔法是由 ConvertTypeNameToPSTypeName()
完成的。在内部,PowerShell 使用一个检索表来转换特定的数据类型:
$field = [System.Management.Automation.LanguagePrimitives].GetField('nameMap', 'NonPublic,Static')
$field.GetValue([System.Management.Automation.LanguagePrimitives])
该检索表看起来类似这样:
Key Value
--- -----
SInt8 SByte
UInt8 Byte
SInt16 Int16
UInt16 UInt16
SInt32 Int32
UInt32 UInt32
SInt64 Int64
UInt64 UInt64
Real32 Single
Real64 double
Boolean bool
String string
DateTime DateTime
Reference CimInstance
Char16 char
Instance CimInstance
BooleanArray bool[]
UInt8Array byte[]
SInt8Array Sbyte[]
UInt16Array uint16[]
SInt16Array int64[]
UInt32Array UInt32[]
SInt32Array Int32[]
UInt64Array UInt64[]
SInt64Array Int64[]
Real32Array Single[]
Real64Array double[]
Char16Array char[]
DateTimeArray DateTime[]
StringArray string[]
ReferenceArray CimInstance[]
InstanceArray CimInstance[]
Unknown UnknownType