RegistryKey 属性真的是PowerShell中的字符串对象吗?

Posted

技术标签:

【中文标题】RegistryKey 属性真的是PowerShell中的字符串对象吗?【英文标题】:Are RegistryKey properties really String objects in powershell? 【发布时间】:2022-01-02 04:29:40 【问题描述】:

在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\7-Zip\7zFM.exe                                                                           
                               InstallLocation : C:\Program Files\7-Zip\                                                                                   
                               UninstallString : "C:\Program Files\7-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 对象吗?如果是这样,为什么冒号后面的部分不会出现?

【问题讨论】:

【参考方案1】:

注册表对象具有定义的输出格式,当没有给出格式时,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)会显示如下Property

$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

【讨论】:

以上是关于RegistryKey 属性真的是PowerShell中的字符串对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

PowerShe 命令行调试指引(转)

PowerShe 使用证书签名 ll脚本

RegistryKey与RegistryValue类找不到问题处理

RegistryKey与RegistryValue类找不到问题处理

RegistryKey与RegistryValue类找不到问题处理

RegistryKey与RegistryValue类找不到问题处理