【问题标题】:Select-String Doesn't Show All Matches With Get-AppxPackageSelect-String 不显示与 Get-AppxPackage 的所有匹配项
【发布时间】:2020-03-02 23:11:42
【问题描述】:

我使用Get-AppxPackage 将所有软件包安装在我的PC 上,我试图在使用Select-String 之前和之后用N 行查找其中的所有匹配项。

但是,选择字符串仅将匹配项显示为单行,也没有显示所有匹配项。这只发生在我通过管道从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


【问题讨论】:

  • 比较(Get-AppxPackage)[0].GetType()(Get-AppxPackage)[0].ToString(),您可能会看到在特定对象上查找字符串时会发生什么。或者Get-AppxPackage | foreach { $_.GetType().FullName }Get-AppxPackage | foreach { $_.ToString() },如果你愿意的话。使用 Get-ChildItem 的文件/目录也可以看到同样的现象。

标签: windows azure powershell grep select-string


【解决方案1】:

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

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

为了让Select-String 搜索对象for-display字符串表示 - 打印到控制台 并且它们会出现在使用> / 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 和 > / @ 的方式相同987654340@ do.
-Stream 使输出行一个接一个通过管道发送。


鉴于该解决方案既不明显又麻烦,如果Select-String直接支持这种行为会很好,理想情况下默认 em>,但至少在通过 switch 参数选择加入的基础上 - 请参阅 feature request #10726 on GitHub - 如果您同意,请在该处投票。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 2023-03-23
    • 2020-08-19
    • 1970-01-01
    • 2014-08-11
    相关资源
    最近更新 更多