获取系统上安装的UWP应用的“普通”(最终用户可读)名称

时间:2018-07-23 14:05:17

标签: powershell uwp win-universal-app

我正在使用以下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)

2 个答案:

答案 0 :(得分:2)

[已完成更新]

您可以在C#中轻松完成此操作。您必须从Windows SDK中引用正确的WinMD(实际目录将根据SDK版本而改变):

  • C:\Program Files (x86)\Windows Kits\10\References\10.0.17134.0\Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmd
  • C:\Program Files (x86)\Windows Kits\10\References\10.0.17134.0\Windows.Foundation.UniversalApiContract\6.0.0.0\Windows.Foundation.UniversalApiContract.winmd

如果您不能构建独立的EXE,而只需要纯PowerShell,则可能可以引用WinMDs %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);
        }
    }
}

答案 1 :(得分:0)

我今天花了一些时间寻找这个,最后想出了一个解决方案,它不涉及代码页面,也不涉及文件/注册表/等。将以下两行放在脚本或函数中,它将返回PoSh友好的输出,您可以将管道运行到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()方法也有一个重载,该重载带有一个姓氏,但文档使我相信它只能接受确切的名称,而不能接受通配符匹配。因此,除非您确切地 正在寻找什么,否则我猜测最好是检索所有软件包的列表,然后在该列表上进行自己的搜索。 / p>

文档确实说这将返回所有用户的软件包,并且需要管理员/高级权限才能运行。