如何在 PowerShell 中查看可用 COM 对象的描述列表?

How to view a list of descriptions of available COM objects in PowerShell?

当我执行此 powershell 命令以获取与前缀 "Python" 匹配的 运行 个 COM 对象的列表时,我得到以下输出:

PS C:\Users\{path-to-arbitrary-directory}> Get-ChildItem HKLM:\Software\Classes | Where-Object {
        $_.PSChildName -match '^Python[\.a-zA-Z]*$' } | Select-Object


    Hive: HKEY_LOCAL_MACHINE\Software\Classes


Name                           Property                                                                                                                                                                     
----                           --------                                                                                                                                                                     
Python                         (default) : Python ActiveX Scripting Engine                                                                                                                                  
Python.Dictionary              (default) : Python Dictionary                                                                                                                                                
Python.Interpreter             (default) : Python Interpreter                                                                                                                                               
Python.TestServer              (default) : Python Test COM Server            

我想做的只是获取名称和描述的列表。

目前我可以通过以下命令获取名称:

PS C:\Users\{path-to-arbitrary-directory}> Get-ChildItem HKLM:\Software\Classes | Where-Object {
            $_.PSChildName -match '^Python[\.a-zA-Z]*$' } | Select-Object PSChildName,Property

PSChildName        Property   
-----------        --------   
Python             {(default)}
Python.Dictionary  {(default)}
Python.Interpreter {(default)}
Python.TestServer  {(default)}

但我一直想不出如何显示我在执行第一个命令时看到的描述?

这是我想要的输出:

Name                           Description
----                           --------                                                                                                                                                                     
Python                         Python ActiveX Scripting Engine                                                                                                                                  
Python.Dictionary              Python Dictionary                                                                                                                                                
Python.Interpreter             Python Interpreter                                                                                                                                               
Python.TestServer              Python Test COM Server  

(如果对大家有帮助,我也可以用这个命令查看说明)

PS C:\Users\{path-to-arbitrary-directory}> Get-ChildItem HKLM:\Software\Classes | Where-Object {
            $_.PSChildName -match '^Python[\.a-zA-Z]*$' } | Get-ItemProperty


(default)    : Python ActiveX Scripting Engine
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Classes\Python
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Classes
PSChildName  : Python
PSProvider   : Microsoft.PowerShell.Core\Registry

...

一种方法是使用计算属性。您可以使用 Get-ItemProperty 获取 (default) 注册表项 属性 的值。然后您可以将此值显示为计算的 属性.

Get-ChildItem HKLM:\software\Classes\ | 
Where-Object {$_.PSChildName -match 'document'} | 
Select-Object PSChildName, @{Name = "Default"; Expression = {($_ | Get-ItemProperty)."(default)"}}

试试这个。这样的东西在功能上更好。

function Get-COMDescription {
    Param(
        [parameter(Mandatory=$true)][string]$Search
    )
    Get-ChildItem HKLM:\Software\Classes | Where-Object { 
        # Match naming convention for COM Object ensure they key has a CLSID folder.
        $_.PSChildName -match "^$Search\.\w+$" -and (Test-Path -Path "$($_.PSPath)\CLSID") } | 
            Select-Object PSChildName,@{l="Description";e={$_ | Get-ItemProperty | select -ExpandProperty "(default)" }}
}

用法示例:

PS C:\> Get-COMDescription -Search GoogleUpdate

PSChildName                                  Description
-----------                                  -----------
GoogleUpdate.CoCreateAsync                   CoCreateAsync
GoogleUpdate.CoreClass                       Google Update Core Class
GoogleUpdate.CoreMachineClass                Google Update Core Class
GoogleUpdate.CredentialDialogMachine         GoogleUpdate CredentialDialog
GoogleUpdate.OnDemandCOMClassMachine         Google Update Broker Class Factory
GoogleUpdate.OnDemandCOMClassMachineFallback Google Update Legacy On Demand
GoogleUpdate.OnDemandCOMClassSvc             Google Update Legacy On Demand
GoogleUpdate.PolicyStatus                    Google Update Policy Status Class
GoogleUpdate.ProcessLauncher                 Google Update Process Launcher Class
GoogleUpdate.Update3COMClassService          Update3COMClass
GoogleUpdate.Update3WebMachine               Google Update Broker Class Factory
GoogleUpdate.Update3WebMachineFallback       GoogleUpdate Update3Web
GoogleUpdate.Update3WebSvc                   GoogleUpdate Update3Web

现有答案很有帮助,但让我添加一些背景信息:

默认输出显示目标键值的原因是 默认输出格式 枚举它们,如该命令所示:

(Get-FormatData Microsoft.Win32.RegistryKey -PowerShellVersion $PSVersionTable.PSVersion).FormatViewDefinition.Control.Rows.Columns.DisplayEntry.Value

这表明:

PSChildName # column 1 - below is the script block that defines column 2
    $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

如您所见,Get-ItemProperty 在后台调用以枚举键的值。

顺便说一句:当从 远程 注册表中检索值时,这种将枚举值作为格式化的一部分的方法会导致输出不正确 - 请参阅 .


在调用 Get-ItemProperty in the script block of a , as shown in the other answers, definitely works, there is a more efficient alternative: You can call the .GetValue() method of the Microsoft.Win32.RegistryKey 个实例时 Get-Item 输出:

Get-ChildItem HKLM:\Software\Classes |
  Where-Object PSChildName -match '^Python[\.a-z]*$' |
    Select-Object @{ n='Name'; e='PSChildName' }, 
                  @{ n='(default)'; e={ $_.GetValue('') } }