Powershell 如何查找 属性 类型的注册表项 属性
Powershell how to find the property type of a registry item property
我发现了几个示例,展示了如何获取、设置和创建注册表项及其属性和值。我需要找到 属性 类型的注册表项 属性 有什么(双字、字符串、多字符串等)
如果我这样做 Get-ItemProperty
我可以获取 属性 的值,像这样:
PS C:\> Get-ItemProperty "HKLM:\SOFTWARE\MySoftware\MyKey\" -Name MyProperty
MyProperty : MyValue
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware\MyKey\
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware
PSChildName : MyValue
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
但是,这并没有告诉我 MyProperty 的值是字符串、双字、多字符串还是其他任何可能的值。我发现获取该信息的唯一方法是将其通过管道传输到 Get-Member
,因为定义告诉我它是什么类型:
PS C:\> Get-ItemProperty "HKLM:\SOFTWARE\MySoftware\MyKey\" -Name MyProperty | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
PSChildName NoteProperty string PSChildName=MyKey
PSDrive NoteProperty PSDriveInfo PSDrive=HKLM
PSParentPath NoteProperty string PSParentPath=Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware
PSPath NoteProperty string PSPath=Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware\MyKey\
PSProvider NoteProperty ProviderInfo PSProvider=Microsoft.PowerShell.Core\Registry
MyProperty NoteProperty string MyProperty=MyValue
然后我可以 select 属性 值,拆分字符串并获取第一个对象,如下所示:
PS C:\> ((Get-ItemProperty "HKLM:\SOFTWARE\MySoftware\MyKey\" -Name MyProperty | Get-Member | Where-Object{$_.Name -eq "MyProperty"}).Definition -split " ")[0]
string
当我使用 DWord 属性执行此操作时,我验证了这会给出 int
,但这感觉并不是查找此信息的正确方法。是否有另一种更合适或更可靠的方法来查找 属性 类型的特定注册表项 属性 具有什么?
编辑: 我也刚刚验证了 String 和 ExpandString return "string" 在这里,所以在某些边缘情况下,即使上述解决方案也不起作用。
您可以使用 .GetType()
方法获取 属性 的类型:
$value = (Get-ItemProperty 'HKLM:\SOFTWARE\MySoftware\MyKey' -Name MyProperty).MyProperty
$value.GetType().Name # outputs e. g. "String"
要显式测试给定类型,请使用 -is
运算符:
$value -is [string] # outputs True if $value is a string
要查看每个注册表值类型如何映射到 PowerShell 类型,我创建了一个注册表项,其中包含所有可能类型的值和 运行 以下脚本:
$props = Get-ItemProperty "HKCU:\test"
$props.PSObject.Properties.Where{ -not $_.Name.StartsWith('PS') }.ForEach{
[pscustomobject]@{ 'Reg Type' = $_.Name; 'PS Type' = $_.Value.GetType() }
}
输出:
Reg Type PS Type
-------- -------
REG_DWORD System.Int32
REG_SZ System.String
REG_QWORD System.Int64
REG_BINARY System.Byte[]
REG_MULTI_SZ System.String[]
REG_EXPAND_SZ System.String
如您所见,REG_SZ
和 REG_EXPAND_SZ
映射到 System.String
,因此当您使用 Get-ItemProperty
读取它们时无法区分它们。相反,您必须使用 .NET 方法 RegistryKey.GetValueKind()
:
$key = Get-Item 'HKLM:\SOFTWARE\MySoftware\MyKey' # $key is of type RegistryKey
$key.GetValue('MyProperty') # Output the value
$key.GetValueKind('MyProperty') # Output the registry type of the value
这会为注册表类型 REG_EXPAND_SZ
输出“ExpandString”。对于其他可能的值,请参阅 RegistryValueKind
枚举。
我发现了几个示例,展示了如何获取、设置和创建注册表项及其属性和值。我需要找到 属性 类型的注册表项 属性 有什么(双字、字符串、多字符串等)
如果我这样做 Get-ItemProperty
我可以获取 属性 的值,像这样:
PS C:\> Get-ItemProperty "HKLM:\SOFTWARE\MySoftware\MyKey\" -Name MyProperty
MyProperty : MyValue
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware\MyKey\
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware
PSChildName : MyValue
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
但是,这并没有告诉我 MyProperty 的值是字符串、双字、多字符串还是其他任何可能的值。我发现获取该信息的唯一方法是将其通过管道传输到 Get-Member
,因为定义告诉我它是什么类型:
PS C:\> Get-ItemProperty "HKLM:\SOFTWARE\MySoftware\MyKey\" -Name MyProperty | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
PSChildName NoteProperty string PSChildName=MyKey
PSDrive NoteProperty PSDriveInfo PSDrive=HKLM
PSParentPath NoteProperty string PSParentPath=Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware
PSPath NoteProperty string PSPath=Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware\MyKey\
PSProvider NoteProperty ProviderInfo PSProvider=Microsoft.PowerShell.Core\Registry
MyProperty NoteProperty string MyProperty=MyValue
然后我可以 select 属性 值,拆分字符串并获取第一个对象,如下所示:
PS C:\> ((Get-ItemProperty "HKLM:\SOFTWARE\MySoftware\MyKey\" -Name MyProperty | Get-Member | Where-Object{$_.Name -eq "MyProperty"}).Definition -split " ")[0]
string
当我使用 DWord 属性执行此操作时,我验证了这会给出 int
,但这感觉并不是查找此信息的正确方法。是否有另一种更合适或更可靠的方法来查找 属性 类型的特定注册表项 属性 具有什么?
编辑: 我也刚刚验证了 String 和 ExpandString return "string" 在这里,所以在某些边缘情况下,即使上述解决方案也不起作用。
您可以使用 .GetType()
方法获取 属性 的类型:
$value = (Get-ItemProperty 'HKLM:\SOFTWARE\MySoftware\MyKey' -Name MyProperty).MyProperty
$value.GetType().Name # outputs e. g. "String"
要显式测试给定类型,请使用 -is
运算符:
$value -is [string] # outputs True if $value is a string
要查看每个注册表值类型如何映射到 PowerShell 类型,我创建了一个注册表项,其中包含所有可能类型的值和 运行 以下脚本:
$props = Get-ItemProperty "HKCU:\test"
$props.PSObject.Properties.Where{ -not $_.Name.StartsWith('PS') }.ForEach{
[pscustomobject]@{ 'Reg Type' = $_.Name; 'PS Type' = $_.Value.GetType() }
}
输出:
Reg Type PS Type
-------- -------
REG_DWORD System.Int32
REG_SZ System.String
REG_QWORD System.Int64
REG_BINARY System.Byte[]
REG_MULTI_SZ System.String[]
REG_EXPAND_SZ System.String
如您所见,REG_SZ
和 REG_EXPAND_SZ
映射到 System.String
,因此当您使用 Get-ItemProperty
读取它们时无法区分它们。相反,您必须使用 .NET 方法 RegistryKey.GetValueKind()
:
$key = Get-Item 'HKLM:\SOFTWARE\MySoftware\MyKey' # $key is of type RegistryKey
$key.GetValue('MyProperty') # Output the value
$key.GetValueKind('MyProperty') # Output the registry type of the value
这会为注册表类型 REG_EXPAND_SZ
输出“ExpandString”。对于其他可能的值,请参阅 RegistryValueKind
枚举。