【问题标题】:Powershell using Select-String gives no results使用 Select-String 的 Powershell 没有结果
【发布时间】:2020-06-27 10:33:45
【问题描述】:

我有以下命令

Get-WindowsDriver -Online -All |  where {$_.ClassName -like "Display"}

这给了我这样的结果

Driver           : vrd.inf
OriginalFileName : C:\Windows\System32\DriverStore\FileRepository\vrd.inf_amd64_3a0ba97737bffd01\vrd.inf
Inbox            : True
ClassName        : Display
BootCritical     : False
ProviderName     : Microsoft
Date             : 6/21/2006 12:00:00 AM
Version          : 10.0.18362.329

Driver           : wvmbusvideo.inf
OriginalFileName : C:\Windows\System32\DriverStore\FileRepository\wvmbusvideo.inf_amd64_483a786e00a2cb7a\wvmbusvideo.inf
Inbox            : True
ClassName        : Display
BootCritical     : False
ProviderName     : Microsoft
Date             : 6/21/2006 12:00:00 AM
Version          : 10.0.18362.1

现在我只想提取两个结果的 OriginalFileName 行,所以我的输出看起来像这样

OriginalFileName : C:\Windows\System32\DriverStore\FileRepository\vrd.inf_amd64_3a0ba97737bffd01\vrd.inf
OriginalFileName : C:\Windows\System32\DriverStore\FileRepository\wvmbusvideo.inf_amd64_483a786e00a2cb7a\wvmbusvideo.inf

现在要获得上述结果,我可以这样做

Get-WindowsDriver -Online -All |  where {$_.ClassName -like "Display"} | findstr OriginalFileName

但是上面命令的问题是 findstr 有我读过的字符限制,因为一些路径被切断了。所以为了解决这个问题,我正在尝试使用 Select-String。这就是我正在做的事情

Get-WindowsDriver -Online -All |  where {$_.ClassName -like "Display"} | Select-String -Pattern "OriginalFileName" 

但我没有得到任何结果。关于我可能做错的任何建议?

【问题讨论】:

    标签: powershell select-string


    【解决方案1】:

    由于 Get-WindowsDriver 返回 objects(Microsoft.Dism.Commands.BasicDriverObject 和/或 Microsoft.Dism.Commands.AdvancedDriverObject),您不应使用 Select-String 来查找这些对象的单个属性对象。

    像这样简单地返回它们

    (Get-WindowsDriver -Online -All |  Where-Object {$_.ClassName -like "Display*"}).OriginalFileName
    

    如果您希望输出看起来像 PropertyName: PropertyValue,您可以使用

    Get-WindowsDriver -Online -All |  Where-Object {$_.ClassName -like "Display*"} | 
                                      Select-Object OriginalFileName | Format-List
    

    【讨论】:

      【解决方案2】:

      有时 findstr 是一种很好的搜索技术。 /i 使其不区分大小写。

      有时选择字符串或 { $_ -match 'whatever' } 有效。这取决于对象如何转换为字符串。

      [pscustomobject]@{name='joe'},[pscustomobject]@{name='bill'} | select-string b
      
      @{name=bill}
      
      
      [pscustomobject]@{name='joe'},[pscustomobject]@{name='bill'} | where { $_ -match 'b' }
      
      name
      ----
      bill
      

      不幸的是 get-windowsdriver 只是转换为“Microsoft.Dism.Commands.BasicDriverObject”:

      $a = Get-WindowsDriver -Online -All | where ClassName -eq Display
      $a[0].ToString()
      
      Microsoft.Dism.Commands.BasicDriverObject
      
      
      $a | select-string dism
      
      Microsoft.Dism.Commands.BasicDriverObject
      Microsoft.Dism.Commands.BasicDriverObject
      Microsoft.Dism.Commands.BasicDriverObject
      

      【讨论】:

        猜你喜欢
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-17
        • 2020-10-21
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多