Строка выбора не показывает все совпадения с Get-AppxPackage - PullRequest
1 голос
/ 06 ноября 2019

Я получаю все пакеты, установленные на моем компьютере, используя Get-AppxPackage, и я пытаюсь найти все совпадения с N строками до и после использования Select-String.

Однако строка выборапоказывает только совпадения в одной строке и не все совпадения. Это происходит только тогда, когда я передаю выходные данные из 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, 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


1 Ответ

1 голос
/ 06 ноября 2019

Select-String, когда задан вход , отличающийся , кроме строк, использует простой .ToString() stringification для каждого входного объекта перед поиском данного шаблона.

InВ вашем случае [Microsoft.Windows.Appx.PackageManager.Commands.AppxPackage] экземпляров, выводимых Get-AppXPackage, преобразуются в полные имена пакетов (например, Microsoft.MicrosoftEdge_44.18362.387.0_neutral__8wekyb3d8bbwe), что объясняет ваш вывод.

Чтобы Select-String выполнял поиск в для отображения строковые представления объектов - как они будут выводиться на консоль или как они будут отображаться в файле, сохраненном в > / Out-File - вы должны использовать Out-String -Stream в качестве промежуточного сегмента конвейера:

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

Out-String использует систему форматирования PowerShell для создания удобного для человека дисплея представления объектов ввода, аналогично выводу на консоль по умолчанию, командлетам Format-* и > / Out-File do.
-Stream вызывает отправку строк вывода по конвейеру один за другим .


Учитывая, что решение являетсянеочевидно и громоздко, было бы неплохо, если бы Select-String напрямую поддерживал это поведение , скажем, через параметр переключателя с именем -FromFormattedOutput, как подробно описано в этого запроса функциина GitHub - проголосуйте за предложение там, если вы согласны.

...