RegistryKey 属性真的是 Powershell 中的 String 对象吗?
Are RegistryKey properties really String objects in powershell?
在powershell中,可以得到一个RegistryKeys
的数组,如下:
$hkeys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
当我检查这个数组的第一个元素时,这是我得到的:
Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Name Property
---- --------
7-Zip DisplayName : 7-Zip 21.03 beta (x64)
DisplayVersion : 21.03 beta
DisplayIcon : C:\Program Files-ZipzFM.exe
InstallLocation : C:\Program Files-Zip\
UninstallString : "C:\Program Files-Zip\Uninstall.exe"
NoModify : 1
NoRepair : 1
EstimatedSize : 5237
VersionMajor : 21
VersionMinor : 3
Publisher : Igor Pavlov
Property
看起来有点奇怪,所以我进一步研究了一下:
> $hkeys[0].property.gettype
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String[] System.Array
property
属性中的元素,由于是用冒号分隔:
,看起来不像是字符串,所以再看了一下,发现确实是String
对象:
> $hkeys[0].property[0].gettype
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
因为它们看起来是字符串对象,所以我试着回应第一个。但是,它只显示字符串的第一部分而不是冒号后面的部分:
> $hkeys[0].property[0]
DisplayName
我觉得这里有些基本的东西我不明白。数组的元素真的是 String
个对象吗?如果是,为什么冒号后面的部分不出现?
注册表对象有定义的输出格式,当没有给出格式时 powershell 使用该格式。您可以在此处阅读更多内容 about_Format.ps1xml
您可以通过调用
来测试这个
$hkeys #formated with name:value, actually uses $hkeys | Out-Default
$hkeys | Format-Table Property #value won't show anymore
$hkeys | Format-List #value won't show anymore
注册表的默认格式文件(例如:C:\Windows\System32\WindowsPowerShell\v1.0\Registry.format.ps1xml)将 属性 显示为正在关注
$result = (Get-ItemProperty -LiteralPath $_.PSPath |
Select * -Exclude PSPath,PSParentPath,PSChildName,PSDrive,PsProvider |
Format-List | Out-String | Sort).Trim()
$result = $result.Substring(0, [Math]::Min($result.Length, 5000) )
if($result.Length -eq 5000) { $result += "..." }
$result
正如您所注意到的,输出是 string[]
要在 powershell 中获取实际值,您需要调用方法或使用 Get-ItemProperty
$hkeys[0].getvalue('DisplayName') #you have to specify the property name
# or
$hkeys[0] | Get-ItemProperty
在powershell中,可以得到一个RegistryKeys
的数组,如下:
$hkeys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
当我检查这个数组的第一个元素时,这是我得到的:
Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Name Property
---- --------
7-Zip DisplayName : 7-Zip 21.03 beta (x64)
DisplayVersion : 21.03 beta
DisplayIcon : C:\Program Files-ZipzFM.exe
InstallLocation : C:\Program Files-Zip\
UninstallString : "C:\Program Files-Zip\Uninstall.exe"
NoModify : 1
NoRepair : 1
EstimatedSize : 5237
VersionMajor : 21
VersionMinor : 3
Publisher : Igor Pavlov
Property
看起来有点奇怪,所以我进一步研究了一下:
> $hkeys[0].property.gettype
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String[] System.Array
property
属性中的元素,由于是用冒号分隔:
,看起来不像是字符串,所以再看了一下,发现确实是String
对象:
> $hkeys[0].property[0].gettype
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
因为它们看起来是字符串对象,所以我试着回应第一个。但是,它只显示字符串的第一部分而不是冒号后面的部分:
> $hkeys[0].property[0]
DisplayName
我觉得这里有些基本的东西我不明白。数组的元素真的是 String
个对象吗?如果是,为什么冒号后面的部分不出现?
注册表对象有定义的输出格式,当没有给出格式时 powershell 使用该格式。您可以在此处阅读更多内容 about_Format.ps1xml
您可以通过调用
来测试这个$hkeys #formated with name:value, actually uses $hkeys | Out-Default
$hkeys | Format-Table Property #value won't show anymore
$hkeys | Format-List #value won't show anymore
注册表的默认格式文件(例如:C:\Windows\System32\WindowsPowerShell\v1.0\Registry.format.ps1xml)将 属性 显示为正在关注
$result = (Get-ItemProperty -LiteralPath $_.PSPath |
Select * -Exclude PSPath,PSParentPath,PSChildName,PSDrive,PsProvider |
Format-List | Out-String | Sort).Trim()
$result = $result.Substring(0, [Math]::Min($result.Length, 5000) )
if($result.Length -eq 5000) { $result += "..." }
$result
正如您所注意到的,输出是 string[]
要在 powershell 中获取实际值,您需要调用方法或使用 Get-ItemProperty
$hkeys[0].getvalue('DisplayName') #you have to specify the property name
# or
$hkeys[0] | Get-ItemProperty