8

我正在尝试为 Windows 10 编写一个将自动启动 Metro 风格应用程序的 powershell 脚本。cmdlet 似乎应该可以工作,Start-Process但是除非我提供指向.exe

例如,以下输入有效:

    Start-Process 'C:\Program Files\Internet Explorer\iexplore.exe'

不幸的是,Metro 风格的应用程序没有可执行文件。我需要使用什么文件来启动它们?例如,如果我想启动 Windows 应用商店,我会怎么做?

谢谢

4

8 回答 8

13

商店应用程序只能由 shell 启动。试试这个:

explorer.exe shell:AppsFolder\Microsoft.WindowsAlarms_8wekyb3d8bbwe!App
于 2016-09-14T12:14:40.013 回答
4

您可以通过在注册表中导航到此处找到与 Start-Process 一起使用的命令:Computer\HKEY_CLASSES_ROOT\Extensions\ContractId\Windows.Protocol\PackageId

然后展开 ActivatableClassId,然后是应用程序,然后在 CustomProperties 文件夹中查看 Name 的值。

Start-Process 必须使用 PowerShell 运行,因为在 CMD 中无法识别。

我用它来启动 Windows Mail 应用程序。

于 2017-12-20T15:27:22.373 回答
3

如果 appx 已注册 URI 协议方案,您可以使用它启动它。例如,要在 Win8/Win10 中启动 windows 商店,请使用以下代码:

    Start-Process ms-windows-store:

我对启动 Metro 风格应用程序的文档如此之少感到惊讶。

于 2015-08-06T16:57:45.657 回答
3

现有答案中有有用的信息,但让我尝试将它们与自动化步骤结合在一起。
此答案假定存在特定于应用程序的 URI 协议如果对于给定的应用程序不是这样,请通过shell:URI 方案调用它,如接受的答案所示(直接将这样的 URI 传递给Start-Process就足够了;例如,
Start-Process shell:AppsFolder\Microsoft.WindowsAlarms_8wekyb3d8bbwe!App)。请注意,您需要知道应用程序家族名称,其中包括抽象发布者 ID ( 8wekyb3d8bbwe);
Get-AppXPackage可以帮助发现 - 见下文。

Windows 8+ Metro 风格的应用程序(过时术语)又名UWP 应用程序/AppX 包/Microsoft Store 应用程序最好通过使用特定于应用程序的协议方案的URL启动:

例如,Calculator Windows 10 应用程序定义了两个 URL 协议名称calculatorms-calculator,它们都可以与尾随:使用 with Start-Process

# Note the trailing ":"
Start-Process calculator: # Or: Start-Process ms-calculator:

Microsoft Edge 支持协议microsoft-edge等,因此您可以打开给定的 URL,例如http://example.org在 Edge 中如下所示:

Start-Process microsoft-edge:http://example.org

请注意,在这种情况下:,协议名称后面是如何跟一个参数传递给目标应用程序的。

警告:从 PowerShell (Core) 7.2 开始,许多 AppX 应用程序无法使用-Wait-PassThru参数启动 - 请参阅此 GitHub 问题

挑战在于如何通过应用程序名称(包名称)发现给定应用程序的协议名称。

以下部分讨论了可以在注册表中找到此信息的位置,并定义了帮助程序函数,它可以自动执行此发现,如果不知道确切的包名称(这是典型的),则GetAppXUriProtocol允许您通过通配符表达式来定位应用程序。

例如,您可以找到计算器应用程序的协议名称,如下所示:

# Find the protocol names supported by the Calculator application,
# by wildcard expression rather than full package name.
PS> Get-AppXUriProtocol *calculator*

PackageFullName                                            Protocols
---------------                                            ---------
Microsoft.WindowsCalculator_10.1908.0.0_x64__8wekyb3d8bbwe {calculator, ms-calculator}

也就是说,您可以使用Start-Process calculator:Start-Process ms-calculator:来启动计算器应用程序。

如果您只需要有关 AppX 包的信息(包括协议名称),请使用标准Get-AppXPackagecmdlet;例如:

PS> Get-AppXPackage *calculator*
Name              : Microsoft.WindowsCalculator
Publisher         : CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
...

发现 AppX 应用程序的 URL 协议名称:

HKEY_CLASSES_ROOT\Extensions\ContractId\Windows.Protocol\PackageId注册表位置具有为已安装的 AppX 包命名的子项,它们在子项的值中指定它们支持的 URL协议Name名称ActivatableClassId\*\CustomProperties

以下函数 ,通过cmdlet 和注册表查找Get-AppXUriProtocol检索与给定 AppX 应用程序关联的协议名称。Get-AppXPackage

该函数支持通配符表达式,因此您可以按包名称的一部分进行搜索,例如应用程序的通用名称;例如
Get-AppXUriProtocol *calc*

Get-AppXUriProtocol源代码

function Get-AppXUriProtocol {
<#
.SYNOPSIS
Gets the URI protocol names assocated with AppX packages on Windows 8 and above.

.DESCRIPTION
Given AppX package names or wildcard expressions, retrieves all associated
URI protocol names that can be used to launch these applications.

AppX is the package format for UWP applications typically distributed via
the Microsoft Store.

For instance, the protocol names associated with the Windows 10 Calculator
application are 'calculator' and 'ms-calculator', so you can use
Start-Process calculator: (note the appended ":") to launch it.

.PARAMETER PackageName
One or more package family names, full package names, or wildcard expresssions
matching either. 

.EXAMPLE
Get-AppXUriProtocol *calculator*

Outputs a [pscustomobject] instance such as the following:

PackageFullName                                            Protocols
---------------                                            ---------
Microsoft.WindowsCalculator_10.1908.0.0_x64__8wekyb3d8bbwe {calculator, ms-calculator}

#>
  [CmdletBinding(PositionalBinding = $false)]
  [OutputType([pscustomobject])]
  param (
    [Parameter(Mandatory, Position = 0)]
    [SupportsWildcards()]
    [string[]] $PackageName
  )
    
  begin {
    if ($env:OS -ne 'Windows_NT') { Throw "This command is supported on Windows only." }
  }

  process {
    # !! Even though Get-AppXPackage allegedly accepts -Name values from the pipeline
    # !! that doesn't work in practice.
    $packages = foreach ($name in $PackageName) { Get-AppXPackage -Name $name }
    foreach ($package in $packages) {
      $protocolSchemes = (Get-ChildItem registry::HKEY_CLASSES_ROOT\Extensions\ContractId\Windows.Protocol\PackageId\$($package.PackageFullName)\ActivatableClassId\*\CustomProperties).ForEach('GetValue', 'Name')
      [pscustomobject] @{ 
        PackageFullName = $package.PackageFullName
        Protocols       = $protocolSchemes
      }
    }
  }

}
于 2019-11-06T15:04:35.937 回答
2

任何出现在这里的人都是因为 WindowsTerminal,我为我的个人资料编写了这个函数,这样我就可以在不将手从键盘上移开的情况下提升:

function term {
    $pkgName = (Get-AppxPackage -Name Microsoft.WindowsTerminal).PackageFamilyName
    $Proc = @{
        FilePath = 'explorer.exe'
        ArgumentList = "shell:AppsFolder\$pkgName!App"
        Verb = 'RunAs'
    }
    Start-Process @proc
}
于 2019-08-12T14:49:23.550 回答
1

如果您下载 Windows SDK,其中有一个名为:的可执行文件, microsoft.windows.softwarelogo.appxlauncher.exe可用于启动 UWP 应用程序。

格式为: microsoft.windows.softwarelogo.appxlauncher.exe <packageFamilyName>!App

您可以通过查看 kayleeFrye_OnDeck 的答案来获取应用程序的 packageFamilyName。

于 2019-03-26T22:10:15.127 回答
0

我不知道一个真正通用的方法来做到这一点,但你可以通过一些中间检查来弄清楚。

注意:我讨厌使用 PowerShell,所以请原谅从 CMD 调用 PS 东西的怪异

第 1 步:弄清楚您拥有哪些应用程序。

powershell Get-AppXPackage将生成所有这些的列表。假设您特别想启动 Desktop App Converter,以便在利用自动化的同时处理一些 Centennial 补丁。因此,我将在 AppX 列表中查询可能匹配的内容,findstr以过滤返回的内容。

第 2 步:确定您是否已经拥有所需的应用程序

powershell Get-AppXPackage | findstr /i Desktop

虽然这给了我很多结果,但我可以清楚地看到一组匹配返回为:

Name              : Microsoft.DesktopAppConverter
PackageFullName   : Microsoft.DesktopAppConverter_2.1.1.0_x64__8wekyb3d8bbwe
InstallLocation   : C:\Program Files\WindowsApps\Microsoft.DesktopAppConverter_2.1.1.0_x64__8wekyb3d8bbwe
PackageFamilyName : Microsoft.DesktopAppConverter_8wekyb3d8bbwe

如果我没有得到像这样的东西,下一步自然是得到该死的东西 :) 所以对于下一步,这可能会变得很棘手,而且你的里程可能会有所不同:

第 3 步:找到应用程序存在的位置,您可以实际调用它:我为什么要这样做?因为如果我尝试从 AppXPackage 查询返回的路径运行它,我会得到"Access is denied."

where DesktopAppConverter

C:\Users\user name\AppData\Local\Microsoft\WindowsApps\DesktopAppConverter.exe 

然后,您应该能够采用该路径并能够从那里运行它。

于 2017-11-23T02:34:35.420 回答
0

它声称 Metro 风格的“App Store”应用程序没有传统的可执行文件,所以我开始挖掘一点,它们确实有。从旧的 skool 管理 cmd.exe 尝试:

 dir "%ProgramW6432%\WindowsApps"
 dir "%ProgramW6432%\WindowsApps\Microsoft.WindowsCalculator_10.1903.21.0_x64__8wekyb3d8bbwe"      Directory of C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.1903.21.0_x64__8wekyb3d8bbwe

 04/30/2019  05:58 PM    <DIR>          .
 04/30/2019  05:58 PM    <DIR>          ..
 04/30/2019  05:58 PM            35,314 AppxBlockMap.xml
 04/30/2019  05:58 PM             3,860 AppxManifest.xml
 04/30/2019  05:58 PM    <DIR>          AppxMetadata
 04/30/2019  05:58 PM            11,296 AppxSignature.p7x
 04/30/2019  05:58 PM    <DIR>          Assets
 04/30/2019  05:58 PM         4,188,672 Calculator.exe
 04/30/2019  05:58 PM            95,744 CalculatorApp.winmd
 04/30/2019  05:58 PM           286,920 resources.pri
 04/30/2019  05:58 PM    <DIR>          WinMetadata

帮我找到了 Ubuntu 的 exe,"%ProgramW6432%\WindowsApps\CanonicalGroupLimited.Ubuntu18.04onWindows_1804.2019.522.0_x64__79rhkp1fndgsc\ubuntu1804.exe"

于 2019-05-27T19:43:12.723 回答