从命令行cmd启动Windows 10 UWP应用程序

8
我希望能够从单个命令行(cmd Windows 10)输入中启动Windows 10 UWP应用程序。但我在将字符串连接起来以形成完整的包名时遇到了问题(此需要是动态的,因为每次部署后应用程序的结束字符串可能会更改)。以下是我的逻辑:
  1. 在LocalAppData目录中查找应用程序包名称(即packageName_postfix)
  2. 将结果#1的末尾附加“!App”
  3. 将该字符串传入启动函数:
我已经找到了#1,但出于某种原因,当我尝试将其附加到#2时,我得到了一个NULL值。这是我当前的命令:

1.) & 2.): 获取包名并将其附加到“!App”

set "x=|dir %LocalAppData%\Packages /b | findstr packageName" & set "y=!App" & set "z=%x%%y%" & echo.%z%

3.): 启动 UWP 应用
explorer.exe shell:appsFolder\packageName_postfix!App

有什么想法吗?

shell:appsFolder 是一个命令,而不是路径组件。 - CatCat
请注意,要附加的ID可能并不总是!App - NotTheDr01ds
4个回答

10

首先,您必须知道此解决方案仅适用于Windows 10秋季创作者更新及更新版本。此API将支持Windows Insider构建版本16266或更高版本。

将此名称空间添加到 Package.appxmanifest 文件中:

xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5"  

然后添加这个扩展:

<Extensions>  
    <uap5:Extension   
      Category="windows.appExecutionAlias"   
      Executable="MyApp.exe"   
      EntryPoint="MyApp.App">  
      <uap5:AppExecutionAlias>  
        <uap5:ExecutionAlias Alias="MyApp.exe" />  
      </uap5:AppExecutionAlias>  
    </uap5:Extension>  
  </Extensions>  
  • 可执行文件名 - 应用程序exe名称(例如:MyApp.exe)
  • EntryPoint - Entrypoint标签应包含应用程序类的完整名称(参考:打开-> App.xaml文件-> Application x: Class名称)
  • AppExecutionAlias - 在命令提示符中的类型别名,用于打开应用程序;将app.exe名称作为别名名称。

构建应用程序并运行一次!

打开命令提示符,键入别名名称->输入

您还可以查看此处的参考资料


2
“构建应用程序”是什么意思?如果我没有应用程序的源代码(并且我没有任何我使用的UWP应用程序的源代码),那该怎么办?在这里我应该构建什么? - Martini Bianco
2
@mar:Stack Overflow是为开发者而设的。如果你正在寻找面向用户的解决方案,请尝试访问超级用户 - IInspectable

2

所以,跟着这个步骤!

explorer.exe shell:appsFolder\**packageName_postfix**!**App**

如何获取packageName_postfix和App?

打开Win+R >> shell:appsFolder 在桌面上为您的应用程序创建快捷方式(右键单击) 然后尝试在快捷方式上单击属性并复制其路径。

最后,win+r explorer.exe shell:appsFolder\Microsoft.ZuneMusic_8wekyb3d8bbwe!Microsoft.ZuneMusic


0

使用PowerShell添加一些“纯命令行方法”。 这些可以组装成一个通用脚本,用于查找启动机制,但是在下面逐个解释各个组件时,“不要一次性把所有东西都放在一起”会更容易。

首先,请注意您可能不再需要explorer.exe方法。 许多最近的UWP应用程序现在包括用于命令行访问的应用程序执行别名。 自从此功能大约5年前推出以来,它已经在所有支持的Windows 10和11版本中可用。

查找启动命令的起点始终是AppxPackage本身。 但有时找到包可能比其他情况更困难:

  • “简单”情况--只需过滤Get-AppxPackage的返回结果,以匹配Name。以Windows终端为例:

    Get-AppxPackage |? { $_.Name -like "*Terminal*" } | tee-object -Variable packageMatches
    
  • 然而,有些应用程序的名称很奇怪。例如,Minecraft Dungeons包的名称是Microsoft.Lovika,我认为这是它在开发过程中的项目名称。除非你知道你要找什么,否则你可能需要根据清单DisplayName执行(较慢的)搜索:

    Get-AppxPackage |? {
        (Get-AppxPackageManifest -Package $_.PackageFullName).Package.Properties.DisplayName -like "*Mine*" 
    } | tee -variable packageMatches
    

一旦您获得了$packageMatches的结果,您可以使用两种不同的方法来查找如何启动它:

  • 使用完全限定路径来执行应用程序的别名,如果有的话。要确定这一点:

    $packageMatches |% {
        $executableName = ((Get-AppxPackageManifest -Package $_.PackageFullName).Package.Applications.Application.Executable)
        if ($executableName) {
            "Start-Process ""$($_.InstallLocation)\$executableName"""
        } else {
            "未找到可执行文件"
        }
    }
    

    注意:返回的Start-Process格式仅用于在PowerShell中启动,并且具有针对带有空格的路径的简化引用规则。根据需要进行调整。

  • 如果没有应用程序执行别名可用,您可以退回到使用其他答案中介绍的explorer.exe shell:appsFolder\<PackageFamilyName>!<Id>方法。为了获取正确的名称和ID:

    $packageMatches |% {
        "explorer.exe shell:appsFolder\$($_.PackageFamilyName)!$((Get-AppxPackageManifest -Package $_.PackageFullName).Package.Applications.Application.Id)"
    }
    

    例如,通过Edge安装的任何PWA(渐进式Web应用)或网站将没有可执行文件,但可以通过explorer.exe启动。


0

可以创建一个快捷方式(.lnk文件),然后执行该快捷方式,这可能不是完美的解决方案,但至少应该非常快速。例如,使用PowerShell需要至少250毫秒的启动时间,并且还会显示控制台窗口,这可能是不必要的。有一个工具可以隐藏控制台窗口:run-hidden

这也是一个非常简单的解决方案,任何人都可以使用,不需要编写和学习复杂的脚本或应用程序,有时候简单的解决方案被忽视了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接