Как сопоставить любую часть строки свойства с помощью Where-Object - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть массив $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?Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

В дополнение к полезный ответ FoxDeploy :

С коллекциями, которые уже находятся в памяти или легко помещаются , вы можете использовать перечисление членов для более удобного синтаксиса, который также приводит к гораздо более быстрому выполнению:

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

-like, когда дан массив в качестве LHS, действуетв качестве фильтра : возвращаются только те элементы массива, которые соответствуют шаблонному выражению в RHS (также в виде массива).

Примечание необходимость в @(...), чтобы гарантировать, что$array.Name - это массив , потому что массив с одним элементом приведет к тому, что свойство .Name будет возвращено как scalar (одна строка),в этом случае -like будет возвращать логическое ($true или $false), а не действовать как фильтр .


Также обратите внимание, что много командлетов PowerShell напрямую поддерживают подстановочные выражения в качестве значений параметров :

Принимая Get-Service Например, его (подразумеваемый) параметр -Name поддерживает подстановочные знаки:

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

К определяет поддержку подстановочного знака данного параметра командлета :

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, которое указывает на поддержку выражений с подстановочными знаками, однако, к сожалению, не надежно , поэтому также проверьте параметр description ;здесь дескрипторная часть Wildcards are permitted предоставляет информацию.
Эта проблема GitHub описывает проблему и просит обеспечить надежное программное обнаружение поддержки подстановочных знаков.

0 голосов
/ 07 февраля 2019

Оператор -like в PowerShell используется для подстановочного совпадения, поэтому вам нужно использовать подстановочный знак, звездочку, *.

Представьте себе этот сценарий, в котором я пытаюсь сопоставитьопределенная служба 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)     

Попробуйте выполнить операцию, используяWildCard, и я держу пари, что это сработает:)

Еще одна вещь, которую я заметил, ваш $string равен SharePoint Policy Assignment, но столбец, с которым вы сравниваете .Name, это просто SharePoint.

...