如何通过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
相关产品推荐
相关产品推荐

