You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PowerShell的FolderItem对象启动应用并提取可执行路径

提取应用可执行路径并实现离线程序化启动索引

从现有Shell对象提取路径/启动标识

你当前用(New-Object -Com Shell.Application).Namespace('shell:appsFolder').Items()获取的应用分两类,需分别处理:

1. 桌面应用(快捷方式)

这类项目可通过GetLink()方法获取快捷方式对象,提取目标路径:

$apps = (New-Object -Com Shell.Application).Namespace('shell:appsFolder').Items()
foreach ($app in $apps) {
    if ($app.IsLink) {
        $link = $app.GetLink()
        [PSCustomObject]@{
            应用名称 = $app.Name
            可执行路径 = $link.TargetPath
            类型 = '桌面应用'
        }
    }
}

2. UWP应用

UWP应用没有直接的可执行文件路径,但可以提取AppUserModelID,用这个标识就能脱离Shell上下文启动:

foreach ($app in $apps) {
    if (-not $app.IsLink -and $app.AppUserModelID) {
        [PSCustomObject]@{
            应用名称 = $app.Name
            AppUserModelID = $app.AppUserModelID
            类型 = 'UWP应用'
            启动命令 = "Start-Process 'shell:appsFolder\$($app.AppUserModelID)'"
        }
    }
}

更高效的信息收集方式

直接读取系统注册表、快捷方式目录和Appx包信息,比Shell COM查询更稳定:

桌面应用:扫描开始菜单快捷方式

直接遍历系统和用户的开始菜单目录,解析.lnk文件:

$startMenuPaths = @(
    "$env:ProgramData\Microsoft\Windows\Start Menu\Programs",
    "$env:APPDATA\Microsoft\Windows\Start Menu\Programs"
)

$desktopApps = Get-ChildItem -Path $startMenuPaths -Filter *.lnk -Recurse | ForEach-Object {
    $shell = New-Object -Com Shell.Application
    $link = $shell.CreateShortcut($_.FullName)
    
    [PSCustomObject]@{
        应用名称 = $_.BaseName
        可执行路径 = $link.TargetPath
        快捷方式路径 = $_.FullName
        类型 = '桌面应用'
    }

    # 释放COM对象避免内存泄漏
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shell) | Out-Null
}

UWP应用:查询Appx包

用Get-AppxPackage获取所有UWP应用的注册信息,提取启动标识:

$uwpApps = Get-AppxPackage -AllUsers | ForEach-Object {
    $package = $_
    # 解析应用清单获取入口点
    $appEntries = Get-AppxPackageManifest $package | Select-Xml -XPath "//Application[@Id]" | ForEach-Object { $_.Node }
    
    foreach ($entry in $appEntries) {
        $appId = "$($package.PackageFamilyName)!$($entry.Id)"
        [PSCustomObject]@{
            应用名称 = $entry.DisplayName ?? $package.DisplayName ?? $entry.Name
            AppUserModelID = $appId
            包名称 = $package.Name
            类型 = 'UWP应用'
            启动命令 = "Start-Process 'shell:appsFolder\$appId'"
        }
    }
}

离线启动实现方案

把收集到的应用信息保存为JSON索引文件,后续离线读取即可直接启动:

1. 保存索引

$allApps = $desktopApps + $uwpApps
$allApps | ConvertTo-Json -Depth 10 | Out-File -Path "C:\AppLaunchIndex.json" -Encoding UTF8

2. 离线启动

读取索引文件,根据应用类型选择启动方式:

$appIndex = Get-Content -Path "C:\AppLaunchIndex.json" | ConvertFrom-Json

# 示例:按名称查找并启动
$targetApp = $appIndex | Where-Object { $_.应用名称 -match "记事本" }
if ($targetApp) {
    if ($targetApp.类型 -eq '桌面应用') {
        Start-Process -FilePath $targetApp.可执行路径
    } else {
        Invoke-Expression $targetApp.启动命令
    }
} else {
    Write-Host "未找到目标应用"
}

注意事项

  • 桌面应用的快捷方式可能指向批处理、脚本而非直接的EXE,需根据实际场景处理
  • UWP应用的AppUserModelID是系统唯一标识,只要应用未卸载,离线状态下依然可以正常启动
  • 处理COM对象后记得释放,避免长期运行导致内存占用过高

内容的提问来源于stack exchange,提问作者J Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:22:16