如何为通过shell:appsFolder启动的Windows应用传递参数
我之前也踩过这个坑!用shell:appsFolder直接加参数确实行不通——这个启动方式本身就没设计参数传递的功能。不过别担心,有几个靠谱的方法能解决你的问题,不管是UWP应用(比如Zune Music)还是打包的Win32应用(比如Clipchamp),都能顺利传递文件路径这类参数。
方法一:用PowerShell的Windows.System.Launcher API(通用所有应用)
这是最推荐的方法,完全模拟了右键「Open With」的行为,几乎所有支持打开文件的应用都能生效。它通过Windows原生API来启动应用并传递文件参数,比直接调用可执行文件更稳定(尤其是UWP应用)。
示例1:启动Zune Music并打开指定视频
# 替换成你要打开的文件路径 $targetFile = Get-Item "C:\tmp\test.mp4" # 应用的唯一启动ID(就是shell:appsFolder里的<包族名>!<应用ID>) $appId = "Microsoft.ZuneMusic_8wekyb3d8bbwe!Microsoft.ZuneMusic" # 加载Windows系统API Add-Type -AssemblyName Windows.System # 配置启动选项,指定目标应用 $launchOptions = New-Object Windows.System.LauncherOptions $launchOptions.TargetApplicationPackageFamilyName = (Get-AppxPackage Microsoft.ZuneMusic).PackageFamilyName # 启动应用并打开文件 [Windows.System.Launcher]::LaunchFileAsync($targetFile, $launchOptions).GetAwaiter().GetResult()
示例2:启动Clipchamp并打开指定视频
$targetFile = Get-Item "C:\tmp\test.mp4" $appId = "Clipchamp.Clipchamp_yxz26nhyzhsrt!App" Add-Type -AssemblyName Windows.System $launchOptions = New-Object Windows.System.LauncherOptions $launchOptions.TargetApplicationPackageFamilyName = (Get-AppxPackage Clipchamp.Clipchamp).PackageFamilyName [Windows.System.Launcher]::LaunchFileAsync($targetFile, $launchOptions).GetAwaiter().GetResult()
方法二:直接启动应用的可执行文件(仅适用于Win32打包应用)
像Clipchamp这类用MSIX打包的Win32应用,你可以直接找到它的可执行文件路径,然后像普通exe一样传参启动。
步骤1:找到可执行文件路径
用PowerShell获取Clipchamp的安装目录:
$clipchampExePath = (Get-AppxPackage Clipchamp.Clipchamp).InstallLocation + "\Clipchamp\Clipchamp.exe"
输出的路径类似:C:\Program Files\WindowsApps\Clipchamp.Clipchamp_2.5.0.0_x64__yxz26nhyzhsrt\Clipchamp\Clipchamp.exe
步骤2:直接启动并传参
在CMD里:
start "" "%clipchampExePath%" "C:\tmp\test.mp4"
或者在PowerShell里:
Start-Process -FilePath $clipchampExePath -ArgumentList "C:\tmp\test.mp4"
注意:WindowsApps文件夹默认权限较高,但通过PowerShell的Get-AppxPackage获取路径后启动,一般不需要额外权限。
方法三:使用应用的执行别名(如果应用支持)
很多打包应用会注册执行别名,直接在命令行输入别名就能启动,还能传参。比如Clipchamp可能已经注册了Clipchamp别名,你可以直接用:
Clipchamp "C:\tmp\test.mp4"
如果不确定有没有别名,可以打开PowerShell运行:
Get-AppxPackage Clipchamp.Clipchamp | Select-Object -ExpandProperty InstallLocation | ForEach-Object { Get-Content "$_\AppxManifest.xml" } | Select-String "AppExecutionAlias"
如果输出里有uap3:AppExecutionAlias节点,就说明有可用的别名,节点里的Alias属性就是你要调用的命令。
为什么你之前的方法行不通?
shell:appsFolder\<包族名>!<应用ID>这个启动方式,本质是调用应用的默认入口点,Windows的这个启动机制不支持传递命令行参数——不管你用explorer.exe还是start命令,后面加的参数都会被忽略。所以必须用上面这些专门支持参数传递的方法才行!




