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=](cat
是 Out-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 了解更多信息。
我使用 Get-AppxPackage
在我的电脑上安装了所有软件包,我试图在使用 Select-String
.
但是,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=](cat
是 Out-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 了解更多信息。