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