Select-字符串不显示与 Get-AppxPackage 的所有匹配项

Select-String Doesn't Show All Matches With Get-AppxPackage

我使用 Get-AppxPackage 在我的电脑上安装了所有软件包,我试图在使用 Select-String.

之前和之后找到 N 行中的所有匹配项

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

时发生

正如您在下面的示例中看到的使用管道和 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, O=Microsoft Corporation, L=Redmond, S=Washington, 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, O=Microsoft Corporation, L=Redmond, S=Washington, 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


Select-String,当给定输入 other 而不是字符串时,使用简单的 .ToString() 字符串化 [1] 在寻找给定模式之前在每个输入对象上。

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

为了Select-String搜索for-display字符串表示objects - 因为它们会打印到控制台 并且它们会出现在用 > / Out-File[= 保存的文件中67=](catOut-File 在 Windows 上的内置别名)- 令人惊讶的是,你必须 使用 Out-String -Stream作为中间管道段:

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

Out-String uses PowerShell's formatting system 生成输入对象的人性化 显示 表示,与默认控制台输出、Format-* cmdlet 和 > / Out-File 做。
-Stream 导致输出行通过管道 一个一个地发送


鉴于解决方案既不明显又繁琐,如果Select-String 直接支持这种行为就更好了,理想情况下 默认 ,但至少在通过开关参数选择加入的基础上 - 请参阅 feature request #10726 on GitHub - 如果你同意,请在那里投票赞成该提案。


[1] 更准确地说,.psobject.ToString() 会按原样调用,或者 - 如果对象的 ToString 方法支持 IFormatProvider 类型的参数- 作为 .psobject.ToString([cultureinfo]::InvariantCulture) 以获得 文化不变 表示 - 请参阅 this answer 了解更多信息。