【问题标题】:How to match any part of a property string using Where-Object如何使用 Where-Object 匹配属性字符串的任何部分
【发布时间】:2019-07-01 19:31:30
【问题描述】:

我有一个包含许多元素的数组$array,示例如下所示:

ProfileID         : 100
UID               : 17
Name              : SharePoint
Description       : SharePoint Server Description

现在我正在尝试按Name 属性进行过滤,要匹配的字符串是:

$string
SharePoint Policy Assignment

我试过了:

$array | Where-Object {$_.Name -like "$string"}
no match

$array | Where-Object {$_.Name -like "$string*"}
no match

$array | Where-Object {$_.Name -match "$string"}
no match

这可以使用 PowerShell 吗?我错过了什么?

【问题讨论】:

  • 假设 $string= 'share', $array | Where-Object {$_.Name -like "$string*"} 适合我。
  • @beatcracker $string = 'SharePoint Policy Assignment' 不起作用
  • 对象name属性中的换行符或奇怪的unicode spaces
  • @LightningWar,您的属性不匹配!数组中的名称列只是 SharePoint,而您的字符串是 SharePoint Policy Assignment

标签: string powershell wildcard member-enumeration


【解决方案1】:

PowerShell 中的-like 运算符用于通配符匹配,因此您需要使用通配符、星号*

想象一下这种情况,我正在尝试匹配特定的 Windows 服务。

$svcs = Get-Service | Select-Object -first 15

C:\temp\blog> $svcs

Status   Name               DisplayName                           
------   ----               -----------                           
Stopped  AJRouter           AllJoyn Router Service                
Stopped  ALG                Application Layer Gateway Service     
Running  AMD External Ev... AMD External Events Utility           
Stopped  AppIDSvc           Application Identity                  
Running  Appinfo            Application Information               
Stopped  AppMgmt            Application Management                
Stopped  AppReadiness       App Readiness                         
Stopped  AppVClient         Microsoft App-V Client                
Stopped  AppXSvc            AppX Deployment Service (AppXSVC)     
Stopped  aspnet_state       ASP.NET State Service                 
Stopped  AssignedAccessM... AssignedAccessManager Service         
Running  AsSysCtrlService   ASUS System Control Service           
Running  AudioEndpointBu... Windows Audio Endpoint Builder        
Running  Audiosrv           Windows Audio                         
Running  AUEPLauncher       AMD User Experience Program Launcher  

要使用-Like 运算符来获得匹配,我必须提供一个通配符,像这样。

$svcs | Where-Object Name -like App*

Status   Name               DisplayName                           
------   ----               -----------                           
Stopped  AppIDSvc           Application Identity                  
Running  Appinfo            Application Information               
Stopped  AppMgmt            Application Management                
Stopped  AppReadiness       App Readiness                         
Stopped  AppVClient         Microsoft App-V Client                
Stopped  AppXSvc            AppX Deployment Service (AppXSVC)     

尝试使用通配符进行操作,我敢打赌它会起作用 :)

我注意到的另一件事是,您的 $string 等于 SharePoint Policy Assignment,但您要比较的 .Name 的列只是 SharePoint

【讨论】:

    【解决方案2】:

    补充FoxDeploy's helpful answer

    使用已经在内存中或很容易适应的集合,您可以使用 member enumeration 获得更方便的语法,从而加快执行速度: p>

    @($array.Name) -like $string  # returns sub-array of matching elements
    

    -like,当给定一个 数组 作为 LHS 时,充当过滤器:仅返回那些与 RHS 上的通配符表达式匹配的数组元素(也作为一个数组)。

    注意需要@(...)以确保$array.Name是一个数组,因为单元素数组会导致.Name 属性作为 scalar(单个字符串)返回,在这种情况下,-like 将返回 Boolean$true$false)而不是而不是充当过滤器


    另请注意,许多 PowerShell cmdlet直接支持通配符表达式作为参数值

    Get-Service为例,其(隐含的)-Name参数支持通配符:

    Get-Service *router*  # returns all services whose Name contains "router"
    

    确定给定 cmdlet 参数的通配符支持

    PS> Get-Help Get-Service -Parameter Name
    
    -Name <String[]>
        Specifies the service names of services to be retrieved. Wildcards are permitted. By default, this cmdlet gets all of the services on the computer.
    
        Required?                    false
        Position?                    1
        Default value                None
        Accept pipeline input?       True (ByPropertyName, ByValue)
        Accept wildcard characters?  false
    

    应该Accept wildcard characters?的值是true,表示支持通配符表达式,但是不幸的是,这不可靠,所以还要检查参数描述;在这里,描述部分 Wildcards are permitted 提供了信息。
    This GitHub issue 描述了问题并要求使通配符支持的编程可发现性可靠。

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2022-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2012-06-15
      • 2023-04-10
      相关资源
      最近更新 更多