Найти в Дзене
inPowerShell

Операторы -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 существует и оператор, обратн
Оглавление

Оператор -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, мы можем создавать достаточно неординарные запросы.