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

标签 windows powershell

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

我正在使用这些 PowerShell 命令:

gci HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | % { Get-ItemProperty $_.PsPath } |选择显示名称、安装位置

gci HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | % { Get-ItemProperty $_.PsPath } |选择显示名称、安装位置

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

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

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

    // ...
    {
        "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: 执行/启动程序所需的值。鉴于 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 Studio\2022\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

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

关于windows - 如何从 Get-ChildItem 获取所有可执行文件的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71889181/

相关文章:

windows - 如何在 Ansible 的 win_environment 模块之后更新 Windows 环境变量?

powershell - Powershell添加成员cmdlet问题

windows - NERDTree 导致 Windows 7 (x64) 上的 gvim (v7.3) 出现问题

windows - 如何仅通过名称从命令行启动 ruby​​ 脚本?

php - memcached.dll 是否存在?

powershell - 为什么自定义构建过程模板执行 PowerShell 失败

powershell - 使用 Visual Studio Code 查看我的函数的文档字符串

PowerShell脚本: AD query based on computer-name pattern not returning results

C++ 包装器 DLL 到静态 LIB

c++ - Windows 的 ThreadSanitizer 日期竞赛测试