Select-String不会显示与Get-AppxPackage匹配的所有内容

我使用Get-AppxPackage将所有软件包安装在PC上,并且尝试使用Select-String前后使用N行查找所有匹配项。

但是,选择字符串仅将匹配项显示为单行,并且也不显示所有匹配项。仅当我通过管道传输Get-AppxPackage的输出时才会发生这种情况,而不是将其写入文件然后执行cat <filename> | select-string ...的情况。

如您在下面的示例中看到的,使用pipe和cat的两个结果。我对类似cat的结果感兴趣,即有关该应用的详细信息。

那么我在这里做错了什么?为什么输出不同?


示例(每个人都应该拥有MS Edge,所以我将其用作示例):

PS > Get-AppxPackage | Select-String -pattern 'edge' -context 3,3 -allmatches

  microsoft.Windows.StartMenuExperienceHost_10.0.18362.329_neutral_neutral_cw5n1h2txyewy
  microsoft.Windows.Cortana_1.13.0.18362_neutral_neutral_cw5n1h2txyewy
  microsoft.AAD.BrokerPlugin_1000.18362.329.0_neutral_neutral_cw5n1h2txyewy
> microsoft.microsoftEdge_44.18362.329.0_neutral__8wekyb3d8bbwe
  microsoft.Windows.CloudExperienceHost_10.0.18362.329_neutral_neutral_cw5n1h2txyewy
  microsoft.Windows.ContentDeliveryManager_10.0.18362.329_neutral_neutral_cw5n1h2txyewy
  Windows.CBSPreview_10.0.18362.329_neutral_neutral_cw5n1h2txyewy
  microsoft.Windows.Apprep.ChxApp_1000.18362.329.0_neutral_neutral_cw5n1h2txyewy
  microsoft.Win32WebViewHost_10.0.18362.329_neutral_neutral_cw5n1h2txyewy
  microsoft.PPIProjection_10.0.18362.329_neutral_neutral_cw5n1h2txyewy
> microsoft.microsoftEdgeDevToolsClient_1000.18362.329.0_neutral_neutral_8wekyb3d8bbwe
  microsoft.LockApp_10.0.18362.329_neutral__cw5n1h2txyewy
> microsoft.EdgeDevtoolsPlugin_10.0.18362.329_neutral_neutral_cw5n1h2txyewy
  microsoft.ECApp_10.0.18362.329_neutral__8wekyb3d8bbwe
  microsoft.CredDialogHost_10.0.18362.329_neutral__cw5n1h2txyewy
  microsoft.BioEnrollment_10.0.18362.329_neutral__cw5n1h2txyewy

PS > cat .\appx-packages.txt | select-string -pattern 'edge' -context 3,3 -allmatches

  SignatureKind     : System
  Status            : Ok

> Name              : microsoft.microsoftEdge
  Publisher         : CN=microsoft Corporation,O=microsoft Corporation,L=Redmond,S=Washington,C=US
  Architecture      : Neutral
  ResourceId        :
  Version           : 44.18362.329.0
> PackageFullName   : microsoft.microsoftEdge_44.18362.329.0_neutral__8wekyb3d8bbwe
> InstallLocation   : C:\Windows\SystemApps\microsoft.microsoftEdge_8wekyb3d8bbwe
  IsFramework       : False
> PackageFamilyName : microsoft.microsoftEdge_8wekyb3d8bbwe
  PublisherId       : 8wekyb3d8bbwe
  IsResourcePackage : False
  IsBundle          : False
  SignatureKind     : System
  Status            : Ok

> Name              : microsoft.microsoftEdgeDevToolsClient
  Publisher         : CN=microsoft Corporation,C=US
  Architecture      : Neutral
  ResourceId        : neutral
  Version           : 1000.18362.329.0
> PackageFullName   : microsoft.microsoftEdgeDevToolsClient_1000.18362.329.0_neutral_neutral_8wekyb3d8bbwe
> InstallLocation   : C:\Windows\SystemApps\microsoft.microsoftEdgeDevToolsClient_8wekyb3d8bbwe
  IsFramework       : False
> PackageFamilyName : microsoft.microsoftEdgeDevToolsClient_8wekyb3d8bbwe
  PublisherId       : 8wekyb3d8bbwe
  IsResourcePackage : False
  IsBundle          : False
  SignatureKind     : System
  Status            : Ok

> Name              : microsoft.EdgeDevtoolsPlugin
  Publisher         : CN=microsoft Windows,C=US
  Architecture      : Neutral
  ResourceId        : neutral
  Version           : 10.0.18362.329
> PackageFullName   : microsoft.EdgeDevtoolsPlugin_10.0.18362.329_neutral_neutral_cw5n1h2txyewy
> InstallLocation   : C:\Windows\SystemApps\microsoft.EdgeDevtoolsPlugin_cw5n1h2txyewy
  IsFramework       : False
> PackageFamilyName : microsoft.EdgeDevtoolsPlugin_cw5n1h2txyewy
  PublisherId       : cw5n1h2txyewy
  IsResourcePackage : False
  IsBundle          : False


ptpstao 回答:Select-String不会显示与Get-AppxPackage匹配的所有内容

Select-String,当给定除字符串以外的其他输入 时,对每个字符串使用简单的.ToString()字符串化 [1] 输入对象,然后再查找给定的模式。

在您的情况下,[Microsoft.Windows.Appx.PackageManager.Commands.AppxPackage]输出的Get-AppXPackage实例将字符串化为完整的程序包名称(例如Microsoft.MicrosoftEdge_44.18362.387.0_neutral__8wekyb3d8bbwe),这将解释您的输出。

为了使Select-String搜索对象 - 用于显示的字符串表示形式它们将打印到控制台,并显示在以> / Out-File 保存到的文件中(catOut-File Windows上的内置别名)-令人惊讶的是,您必须使用Out-String -Stream 作为中间管道段:

Get-AppxPackage | Out-String -Stream | Select-String -Pattern 'edge' -Context 3,3

Out-String使用PowerShell的formatting system生成输入对象的人性化 display 表示形式,与默认控制台输出Format-* cmdlet相同,和> / Out-File做。
-Stream导致输出线通过管道一对一发送。


鉴于该解决方案既不明显也不麻烦,如果Select-String 直接支持此行为(例如通过名为switch的开关参数)会很好-FromFormattedOutput(如this feature request on GitHub中所述)-如果您同意,请在此处投票批准该提案。


[1]更准确地说,按原样调用.psobject.ToString(),或者-如果对象的ToString方法支持IFormatProvider类型的参数-如{{ 1}},以获得文化不变表示-有关更多信息,请参见this answer

本文链接:https://www.f2er.com/3152055.html

大家都在问