Операторы -like, -notlike и -not в PowerShell

Оператор -like позволяет нам использовать символы подстановки при выборе требуемых значений.

Например, так.

Get-Service | Where-Object Description -like "*wsman*"

Или же

Get-Service | Where-Object Description -like "*w?man*"

По умолчанию этот оператор не чувствителен к регистру. То есть, следующие команды будут полностью равнозначными.

Get-Service | Where-Object Description -like "*wsman*"
Get-Service | Where-Object Description -like "*WSman*"
Get-Service | Where-Object Description -like "*WSMAN*"

Если же нам нужно, чтобы оператор -like принимал во внимание регистр рассматриваемых им элементов, то есть, был, что называется, case-sensitive, мы можем указать его как -clike

Get-Service | Where-Object Description -clike "*wsman*"

С другой стороны, чтобы развеять все сомнения в том, что оператор к регистру не чувствителен, то есть, case-insensitive, мы можем указать его как -ilike.

Get-Service | Where-Object Description -ilike "*wsman*"

Кроме того, в PowerShell существует и оператор, обратный вышеуказанному, -notlike.

Get-Service | Where-Object StartupType -notlike "Auto*"

Который, в свою очередь, точно так же обладает двумя вариациями: -cnotlike и -inotlike.

Result

Как и многие другие операторы сравнения, -like возвращает различные типы результатов в зависимости от того, сравнивается скалярное значение или массив.

Если мы передаем ему скалярное значение, то результатом будет объект типа bool, то есть True или False.

"Some string." -like "*string*"
True
"Some string." -like "*integer*"
False

Если же мы передадим ему массив, результатом будут те элементы массива, которые соответствуют заданному условию.

"Winter", "Spring", "Summer", "Autumn" -like "*er"
Winter
Summer

Combine

Кроме простых сравнений операторы -like и -notlike позволяют нам задавать и более сложные условия.

Начнем с того, что получим все службы, которые зависят от Remote Procedure Call (RPC).

Get-Service | Where-Object { $_.RequiredServices.Name -like "RpcSs" } | Select-Object Name, DisplayName, RequiredServices
Name                 DisplayName                             RequiredServices
----                 -----------                             ----------------
AppIDSvc             Application Identity                    {RpcSs, CryptSvc, AppID}
Appinfo              Application Information                 {RpcSs, ProfSvc}
AppVClient           Microsoft App-V Client                  {AppvVfs, RpcSS, AppvStrm, netprofm}
AppXSvc              AppX Deployment Service (AppXSVC)       {rpcss, staterepository}
Audiosrv             Windows Audio                           {AudioEndpointBuilder, RpcSs}
autotimesvc          Cellular Time                           {rpcss}
AxInstSV             ActiveX Installer (AxInstSV)            {rpcss}
BFE                  Base Filtering Engine                   {RpcSs}
BITS                 Background Intelligent Transfer Service {RpcSs}
BrokerInfrastructure Background Tasks Infrastructure Service {DcomLaunch, RpcSs, RpcEptMapper}

...

Как видите, среди результатов присутствуют как службы, зависящие исключительно от RpcSs, так и те, для работы которых требуются и некоторые другие службы.

Давайте получим службы, работа которых зависит не только от Remote Procedure Call (RPC).

Get-Service | Where-Object { $_.RequiredServices.Name -like "RpcSs" -and $_.RequiredServices.Name -notlike "RpcSs" } | Select-Object Name, DisplayName, RequiredServices
Name                 DisplayName                             RequiredServices
----                 -----------                             ----------------
AppIDSvc             Application Identity                    {RpcSs, CryptSvc, AppID}
Appinfo              Application Information                 {RpcSs, ProfSvc}
AppVClient           Microsoft App-V Client                  {AppvVfs, RpcSS, AppvStrm, netprofm}
AppXSvc              AppX Deployment Service (AppXSVC)       {rpcss, staterepository}
Audiosrv             Windows Audio                           {AudioEndpointBuilder, RpcSs}
BrokerInfrastructure Background Tasks Infrastructure Service {DcomLaunch, RpcSs, RpcEptMapper}

...

Теперь же получим те службы, для работы которых требуется только RpcSs.

Get-Service | Where-Object { $_.RequiredServices.Name -like "RpcSs" -and -not ($_.RequiredServices.Name -notlike "RpcSs") } | Select-Object Name, DisplayName, RequiredServices
Name        DisplayName                             RequiredServices
----        -----------                             ----------------
autotimesvc Cellular Time                           {rpcss}
AxInstSV    ActiveX Installer (AxInstSV)            {rpcss}
BFE         Base Filtering Engine                   {RpcSs}
BITS        Background Intelligent Transfer Service {RpcSs}

...

Таким образом, используя комбинации операторов -like, -notlike и -not, мы можем создавать достаточно неординарные запросы.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s