powershell通过注册表app paths、扫描安装目录和解析appx包三类数据源高效枚举windows已安装应用的可执行路径。首先从hklm...\app paths提取win32主程序路径,其次扫描programfiles、localappdata等目录获取便携软件,最后通过get-appxpackage构造shell:appsfolder路径启动uwp/msix应用,合并去重后导出csv或json。
powershell 可以高效枚举 windows 上已安装应用的可执行路径,核心在于结合注册表、程序文件目录和现代应用清单(如 appx)三类数据源。关键不是“找所有 .exe”,而是“找用户能实际启动的、有明确入口的应用路径”。
从注册表读取传统桌面应用路径
多数 Win32 应用会在注册表中登记其主可执行文件,位置集中在:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
该键下每个子项名通常是程序名(如 notepad.exe),默认值((default))即为完整路径。
执行以下命令可批量提取:
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\*' -ErrorAction SilentlyContinue |
Where-Object { $_.PSChildName -match '\.exe$' } |
ForEach-Object {
[PSCustomObject]@{
Name = $_.PSChildName
Path = $_.'(default)'
Type = 'Win32 (App Paths)'
}
}
扫描常见安装目录补充遗漏项
部分绿色软件或便携版不会写注册表,需主动扫描典型路径。重点关注:
-
%ProgramFiles% 和 %ProgramFiles(x86)% 下的
*\*.exe - %LocalAppData%\Programs\*(如 Electron 应用)
- %AppData%\Roaming\* 中带 GUI 的工具(如 Slack、Zoom)
示例(仅返回有图标或版本信息的可执行文件,避免杂项):
$dirs = "${env:ProgramFiles}", "${env:ProgramFiles(x86)}", "$env:LOCALAPPDATA\Programs"
$paths = @()
foreach ($dir in $dirs) {
if (Test-Path $dir) {
Get-ChildItem $dir -Filter "*.exe" -Recurse -ErrorAction SilentlyContinue -File |
Where-Object { try { [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_.FullName).ProductName } catch {} } |
ForEach-Object {
$ver = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_.FullName)
[PSCustomObject]@{
Name = $ver.ProductName -replace '\s+\d+(\.\d+)*$', ''
Path = $_.FullName
Type = 'Portable / Installed EXE'
}
}
}
}
$paths | Sort-Object Name -Unique
获取 UWP / MSIX 应用的启动入口
现代应用不提供直接 .exe 路径,但可通过 Get-AppxPackage 获取包信息,并用 Get-AppxPackageManifest 提取 Application 节点中的 Executable 属性(若存在)。更通用的方式是构造 shell:AppsFolder 协议路径:
Get-AppxPackage | ForEach-Object {
$packageFamilyName = $_.PackageFamilyName
$appUserModelId = "$packageFamilyName!App"
[PSCustomObject]@{
Name = $_.Name
Path = "shell:AppsFolder\$packageFamilyName!App"
Type = 'UWP / MSIX'
AUMID = $appUserModelId
}
}
该路径可在资源管理器中打开,也可传给 Start-Process 启动(例如:Start-Process "shell:AppsFolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge")。
合并去重并导出结构化结果
将三类来源统一为对象数组后,按 Name + Path 去重,保留最可信来源(App Paths > Manifest > 扫描目录),并支持导出为 CSV 或 JSON:
$allApps = @($regApps + $scannedApps + $uwpApps) | Sort-Object Name, Path | Get-Unique -AsString <p>$allApps | Export-Csv -Path "$env:TEMP\AppPaths.csv" -NoTypeInformation -Encoding UTF8</p><h1>或转为 JSON 供其他脚本消费</h1><p>$allApps | ConvertTo-Json -Depth 3 | Out-File "$env:TEMP\AppPaths.json" -Encoding UTF8 </p>
注意:管理员权限非必需,但会影响 HKLM 注册表读取完整性;普通用户运行时建议同时检查 HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths。











