获取安装在系统上的 UWP 应用程序的 "plain"(最终用户可读)名称
Get the "plain" (end-user readable) name of UWP apps installed on a system
我正在使用以下 PowerShell 脚本来检索系统上的 UWP 应用程序列表并将其保存到文本文件中。它获取 ID、名称(系统名称)和 packagefamilyname。
除了名称之外,我还在寻找一种方法来检索应用程序的普通名称:例如,"OneNote" 而不是 "Microsoft.Office.OneNote"。理想情况下,这个名称也应该被本地化:例如,"Calculatrice"(在法语系统上)而不是 "Microsoft.WindowsCalculator".
我找到了这个 list of info retrieved by Get-AppxPackage 但一点也不像最终用户可读的名称...我不是很熟悉这个专业领域。任何帮助将不胜感激。
$installedapps = get-AppxPackage
$ids = $null
foreach ($app in $installedapps)
{
try
{
$ids = (Get-AppxPackageManifest $app -erroraction Stop).package.applications.application.id
}
catch
{
Write-Output "No Id's found for $($app.name)"
}
foreach ($id in $ids)
{
$line = $app.Name + "`t" + $app.packagefamilyname + "!" + $id
echo $line
$line >> 'c:\temp\output.txt'
}
}
write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
[更新完成]
您可以在 C# 中轻松完成此操作。您必须从 Windows SDK 中引用正确的 WinMD(实际目录将根据 SDK 版本而变化):
C:\Program Files (x86)\Windows Kits\References.0.17134.0\Windows.Foundation.FoundationContract.0.0.0\Windows.Foundation.FoundationContract.winmd
C:\Program Files (x86)\Windows Kits\References.0.17134.0\Windows.Foundation.UniversalApiContract.0.0.0\Windows.Foundation.UniversalApiContract.winmd
如果您不能构建独立的 EXE 而只想使用纯 PowerShell,您可能 可以参考 WinMD %systemroot%\system32\winmetadata
。代码非常简单(我避免了 await
因为我不知道 PowerShell 是否有):
// using Windows.Management.Deployment;
static void Main(string[] args)
{
GetList();
}
static void GetList()
{
var pm = new PackageManager();
var packages = pm.FindPackagesForUser("");
foreach (var package in packages)
{
var asyncResult = package.GetAppListEntriesAsync();
while (asyncResult.Status != Windows.Foundation.AsyncStatus.Completed)
{
Thread.Sleep(10);
}
foreach (var app in asyncResult.GetResults())
{
Console.WriteLine(app.DisplayInfo.DisplayName);
}
}
}
我今天花了一些时间寻找这个,终于想出了一个不涉及代码页或在 files/registry/etc 中挖掘的解决方案。将以下两行放在脚本或函数中,它将 return PoSh-friendly 输出,然后您可以将其输入 ForEach-Object、Where-Object、Sort-Object、Export-CSV,等等
$PkgMgr = [Windows.Management.Deployment.PackageManager,Windows.Web,ContentType=WindowsRuntime]::new()
$PkgMgr.FindPackages() | Select-Object DisplayName -ExpandProperty Id
.FindPackages() 方法也有一个采用姓氏的重载,但文档让我相信它只能接受确切的名字,不能接受通配符匹配。所以除非你确切地知道你在找什么,我猜最好检索所有包的列表,然后自己做在该列表中搜索。
文档确实说这将为所有用户 return 包,并且它需要 admin/elevated 权限 运行。
我正在使用以下 PowerShell 脚本来检索系统上的 UWP 应用程序列表并将其保存到文本文件中。它获取 ID、名称(系统名称)和 packagefamilyname。
除了名称之外,我还在寻找一种方法来检索应用程序的普通名称:例如,"OneNote" 而不是 "Microsoft.Office.OneNote"。理想情况下,这个名称也应该被本地化:例如,"Calculatrice"(在法语系统上)而不是 "Microsoft.WindowsCalculator".
我找到了这个 list of info retrieved by Get-AppxPackage 但一点也不像最终用户可读的名称...我不是很熟悉这个专业领域。任何帮助将不胜感激。
$installedapps = get-AppxPackage
$ids = $null
foreach ($app in $installedapps)
{
try
{
$ids = (Get-AppxPackageManifest $app -erroraction Stop).package.applications.application.id
}
catch
{
Write-Output "No Id's found for $($app.name)"
}
foreach ($id in $ids)
{
$line = $app.Name + "`t" + $app.packagefamilyname + "!" + $id
echo $line
$line >> 'c:\temp\output.txt'
}
}
write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
[更新完成]
您可以在 C# 中轻松完成此操作。您必须从 Windows SDK 中引用正确的 WinMD(实际目录将根据 SDK 版本而变化):
C:\Program Files (x86)\Windows Kits\References.0.17134.0\Windows.Foundation.FoundationContract.0.0.0\Windows.Foundation.FoundationContract.winmd
C:\Program Files (x86)\Windows Kits\References.0.17134.0\Windows.Foundation.UniversalApiContract.0.0.0\Windows.Foundation.UniversalApiContract.winmd
如果您不能构建独立的 EXE 而只想使用纯 PowerShell,您可能 可以参考 WinMD %systemroot%\system32\winmetadata
。代码非常简单(我避免了 await
因为我不知道 PowerShell 是否有):
// using Windows.Management.Deployment;
static void Main(string[] args)
{
GetList();
}
static void GetList()
{
var pm = new PackageManager();
var packages = pm.FindPackagesForUser("");
foreach (var package in packages)
{
var asyncResult = package.GetAppListEntriesAsync();
while (asyncResult.Status != Windows.Foundation.AsyncStatus.Completed)
{
Thread.Sleep(10);
}
foreach (var app in asyncResult.GetResults())
{
Console.WriteLine(app.DisplayInfo.DisplayName);
}
}
}
我今天花了一些时间寻找这个,终于想出了一个不涉及代码页或在 files/registry/etc 中挖掘的解决方案。将以下两行放在脚本或函数中,它将 return PoSh-friendly 输出,然后您可以将其输入 ForEach-Object、Where-Object、Sort-Object、Export-CSV,等等
$PkgMgr = [Windows.Management.Deployment.PackageManager,Windows.Web,ContentType=WindowsRuntime]::new()
$PkgMgr.FindPackages() | Select-Object DisplayName -ExpandProperty Id
.FindPackages() 方法也有一个采用姓氏的重载,但文档让我相信它只能接受确切的名字,不能接受通配符匹配。所以除非你确切地知道你在找什么,我猜最好检索所有包的列表,然后自己做在该列表中搜索。
文档确实说这将为所有用户 return 包,并且它需要 admin/elevated 权限 运行。