现有答案中有有用的信息,但让我尝试将它们与自动化步骤结合在一起。
此答案假定存在特定于应用程序的 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 协议名称calculator
和ms-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-AppXPackage
cmdlet;例如:
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
}
}
}
}