如何从 Get-ChildItem 获取所有可执行文件的路径

How to get Paths to all executables from Get-ChildItem

我目前正在尝试获取所有已安装应用程序的列表,并希望构建一个可以启动这些应用程序的功能。

我正在使用这些 PowerShell 命令:

gci HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | % { Get-ItemProperty $_.PsPath } | Select DisplayName,InstallLocation

gci HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | % { Get-ItemProperty $_.PsPath } | Select DisplayName,InstallLocation

结合 ConvertTo-Json 以获得我可以使用的良好标准输出。 现在,这只给我没有任何可执行文件的 InstallPath。

有什么简单的方法可以获取列表中应用程序的主要可执行文件吗?

预期结果(密钥名称无关紧要):

    // ...
    {
        "DisplayName":  "Microsoft Edge",
        "InstallLocation":  "C:\Program Files (x86)\Microsoft\Edge\Application",
        "LaunchApplication": "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe",
    },
    {
        "DisplayName":  "Audacity 2.4.2",
        "InstallLocation":  "C:\Program Files (x86)\Audacity\",
        "LaunchApplication": "C:\Program Files (x86)\Audacity\audacity.exe"
    },
    // ...

正如其他人在评论中指出的那样,没有一种常规方法可以获取某些程序的可执行路径。

要回答您关于构建应用程序启动方法的间接问题,我们可以使用一些 东西。对我们来说幸运的是,PowerShell 有一个 Get-StartApps cmdlet,可以生成当前用户安装的应用程序的输出:


Name                                                 AppID
----                                                 -----
3D Viewer                                            Microsoft.Microsoft3DViewer_8wekyb3d8bbwe!Microsoft.Microsoft3DViewer
AdGuard                                              AdGuard
Adobe Acrobat DC                                     {6D809377-6AF0-444B-8957-A3773F02200E}\Adobe\Acrobat DC\Acrobat\Acrobat.exe
Battle.net                                           {7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}\Battle.net\Battle.net Launcher.exe
Blend for Visual Studio 2022                         Blend.d58ce8bb
Calculator                                           Microsoft.WindowsCalculator_8wekyb3d8bbwe!App
Calendar                                             microsoft.windowscommunicationsapps_8wekyb3d8bbwe!microsoft.windowslive.calendar

显示了 2 个属性:

  • 姓名
  • AppID.

这变得很重要,因为 AppID 是 shell: 到 execute/launch 程序所需的值。鉴于 Get-StartApps 的上述输出,您可以通过将 AppID 传递给 shell:\AppsFolder\"AppID".

来启动“Adobe Acrobat DC”
Start-Process shell:AppsFolder\"{6D809377-6AF0-444B-8957-A3773F02200E}\Adobe\Acrobat DC\Acrobat\Acrobat.exe"

使用 @zett42's 方法,我们可以查询您的开始菜单,以及 .lnk 的系统开始菜单文件夹路径 使用 WScript COM 对象检索其目标路径:

$paths = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs","$env:APPDATA\Microsoft\Windows\Start Menu"
Get-ChildItem -Path $paths -Filter "*.lnk" -File -Recurse | 
    ForEach-Object -Begin {
        $WScriptShell = New-Object -ComObject "WScript.Shell"
    } -Process {
        [PSCustomObject]@{
            Name = $_.BaseName
            Path = $WScriptShell.CreateShortcut($_.FullName).TargetPath
        }
    } -End {
        [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($WScriptShell) #release COM object
    }

这将输出:

Name                         Path
----                         ----
Adobe Acrobat DC             C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe
Blend for Visual Studio 2022 C:\Program Files\Microsoft Visual Studio22\Community\Common7\IDE\Blend.exe
Firefox                      C:\Program Files\Mozilla Firefox\firefox.exe
Google Chrome                C:\Program Files\Google\Chrome\Application\chrome.exe
Microsoft Edge               C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
TechPowerUp GPU-Z            C:\Program Files (x86)\GPU-Z\GPU-Z.exe

不完全确定这就是您想要的,但它可能对其他人有帮助。