You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为通过shell:appsFolder启动的Windows应用传递参数

如何为通过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命令,后面加的参数都会被忽略。所以必须用上面这些专门支持参数传递的方法才行!

火山引擎 最新活动