about_Comparison_Operators

Назначение: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

Вставьте сюда введение.

РАЗДЕЛ

about_Comparison_Operators

КРАТКОЕ ОПИСАНИЕ

Содержит описание операторов сравнения, используемых в Windows PowerShell®.

ПОДРОБНОЕ ОПИСАНИЕ

Операторы сравнения позволяют указать условия сравнения и поиска значений, удовлетворяющих указанным шаблонам. При использовании оператора сравнения необходимо указать значения, которые нужно сравнить, а также оператор, который будет разделять эти значения.

В Windows PowerShell имеются следующие операторы сравнения:

-eq
      -ne
      -gt
      -ge   
      -lt
      -le
      -Like
      -NotLike
      -Match
      -NotMatch
      -Contains
      -NotContains
      -In
      -NotIn
      -Replace

По умолчанию во всех операторах сравнения не учитывается регистр символов. Для учета регистра символов в операторе сравнения необходимо указать перед именем оператора букву «c». Например, «-ceq» — это версия оператора «-eq», учитывающая регистр символов. Чтобы отменить учет регистра символов в явном виде, укажите перед именем оператора букву «i». Например, «-ieq» — это версия оператора «-eq», в которой явно отключен учет регистра символов.

Если входными данными является скалярное значение, операторы сравнения возвращают логическое значение. Если в качестве входных данных используется коллекция значений, операторы сравнения возвращают все соответствующие значения. Если в коллекции не найдено соответствий, эти операторы не вернут ничего.

Исключениями являются операторы вложения (-Contains, -NotContains), операторы In (-In, -NotIn) и операторы типа (-Is, -IsNot), которые всегда возвращают логическое значение.

В Windows PowerShell поддерживаются перечисленные ниже операторы сравнения.

-eq

Описание: равенство. Содержит совпадающее значение.

Пример:

        PS C:\> "abc" -eq "abc"
        True

        PS C:\> "abc" -eq "abc", "def"
        False

        PS C:\> "abc", "def" -eq "abc"
        abc

-ne

Описание: неравенство. Содержит несовпадающее значение.

Пример:

        PS C:\> "abc" -ne "def"
        True

        PS C:\> "abc" -ne "abc"
        False

        PS C:\> "abc" -ne "abc", "def"
        True

        PS C:\> "abc", "def" -ne "abc"
        def

-gt

Описание: больше.

Пример:

          PS C:\> 8 -gt 6
          True

          PS C:\> 7, 8, 9 -gt 8
          9

-ge

Описание: больше или равно.

Пример:

          PS C:\> 8 -ge 8
          True         

          PS C:\> 7, 8, 9 -ge 8
          8
          9

-lt

Описание: меньше.

Пример:

          PS C:\> 8 -lt 6
          False

          PS C:\> 7, 8, 9 -lt 8
          7

-le

Описание: меньше или равно.

Пример:

          PS C:\> 6 -le 8
          True

          PS C:\> 7, 8, 9 -le 8
          7
          8

-Like

Описание: соответствие с использованием подстановочного знака (*).

Пример:

          PS C:\> "Windows PowerShell" -like "*shell"
          True

          PS C:\> "Windows PowerShell", "Server" -like "*shell"
          Windows PowerShell

-NotLike

Описание: несоответствие с использованием подстановочного знака (*).

Пример:

          PS C:\> "Windows PowerShell" -NotLike "*shell"
          False

          PS C:\> "Windows PowerShell", "Server" -NotLike "*shell"
          Server   

-Match

Описание: соответствие строк с учетом регулярных выражений. Если в качестве входных данных используется скалярное значение, оператор заносит результат в автоматическую переменную $Matches.

Пример:

           PS C:\> "Sunday" -Match "sun" 
          True 

          PS C:\> $matches 
          Name Value 
          ---- ----- 
          0    Sun
 
          PS C:\> "Sunday", "Monday" -Match "sun" 
          Sunday

-NotMatch

Описание: несоответствие строк. Используются регулярные выражения. Если в качестве входных данных используется скалярное значение, оператор заносит результат в автоматическую переменную $Matches.

Пример:

          PS C:\> "Sunday" -NotMatch "sun"
          False

          PS C:\> $matches 
          Name Value 
          ---- ----- 
          0    sun

          PS C:\> "Sunday", "Monday" -NotMatch "sun" 
          Monday

-Contains

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

Если тестовое значение является коллекцией, оператор Contains проверяет равенство ссылок. Значение TRUE возвращается только в том случае, если одно из контрольных значений является экземпляром объекта контрольного значения.

Синтаксис:

<Reference-values> -Contains <Test-value>

Примеры:

          PS C:\> "abc", "def" -Contains "def"
          True

          PS C:\> "Windows", "PowerShell" -Contains "Shell"
          False  #Not an exact match


          # Does the list of computers in $domainServers
          # include $thisComputer?
          # -------------------------------------------
          PS C:\> $domainServers -Contains $thisComputer
          True

          PS C:\> "abc", "def", "ghi" -Contains "abc", "def"
          False

          PS C:\> $a = "abc", "def"
          PS C:\> "abc", "def", "ghi" -Contains $a
          False
          PS C:\> $a, "ghi" -Contains $a
          True

-NotContains

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

Если тестовое значение является коллекцией, оператор NotContains проверяет равенство ссылок.

Синтаксис:

<Reference-values> -NotContains <Test-value>

Примеры:

PS C:\> "Windows", "PowerShell" -NotContains "Shell"
          True  #Not an exact match


          # Get cmdlet parameters, but exclude common parameters
          function get-parms ($cmdlet)
          {
              $Common = "Verbose", "Debug", "WarningAction", "WarningVariable", `
                        "ErrorAction", "ErrorVariable", "OutVariable", "OutBuffer" 
    
              $allparms = (Get-Command $Cmdlet).parametersets | foreach {$_.Parameters} | `
                          foreach {$_.Name} | Sort-Object | Get-Unique
    
              $allparms | where {$Common -NotContains $_ }
          }


          # Find unapproved verbs in the functions in my module
          # -------------------------------------------
          PS C:\> $ApprovedVerbs = Get-Verb | foreach {$_.verb}
          PS C:\> $myVerbs = Get-Command -Module MyModule | foreach {$_.verb}

          PS C:\> $myVerbs | where {$ApprovedVerbs -NotContains $_}      
          ForEach
          Sort
          Tee
          Where

-In

Описание: оператор вхождения. Указывает, имеется ли контрольное значение в коллекции контрольных значений. Всегда возвращает логическое значение. Возвращает значение TRUE только в том случае, если проверяемое значение точно совпадает по крайней мере с одним из контрольных значений.

Если тестовое значение является коллекцией, оператор In проверяет равенство ссылок. Значение TRUE возвращается только в том случае, если одно из контрольных значений является экземпляром объекта контрольного значения.

Оператор In появился в Windows PowerShell 3.0.

Синтаксис:

<Test-value> -in <Reference-values> 

Примеры:

PS C:\> "def" -in "abc", "def"
          True

          PS C:\> "Shell" -in "Windows", "PowerShell"
          False  #Not an exact match

          PS C:\> "Windows" -in "Windows", "PowerShell"
          True  #An exact match

          PS C:\> "Windows", "PowerShell" -in "Windows", "PowerShell", "ServerManager"
          False  #Using reference equality

          PS C:\> $a = "Windows", "PowerShell"
          PS C:\> $a -in $a, "ServerManager"
          True  #Using reference equality

          # Does the list of computers in $domainServers
          # include $thisComputer?
          # -------------------------------------------
          PS C:\> $thisComputer -in  $domainServers
          True

-NotIn

Описание: оператор NotIn. Указывает, имеется ли контрольное значение в коллекции контрольных значений. Всегда возвращает логическое значение. Возвращает значение TRUE в том случае, если проверяемое значение не совпадает в точности по крайней мере с одним из контрольных значений.

Если тестовое значение является коллекцией, оператор In проверяет равенство ссылок. Значение TRUE возвращается только в том случае, если одно из контрольных значений является экземпляром объекта контрольного значения.

Оператор NotIn появился в Windows PowerShell 3.0.

Синтаксис:

<Test-value> -NotIn <Reference-values> 

Примеры:

PS C:\> "def" -NotIn "abc", "def"
          False

          PS C:\> "ghi" -NotIn "abc", "def"
          True

          PS C:\> "Shell" -NotIn "Windows", "PowerShell"
          True  #Not an exact match

          PS C:\> "Windows" -NotIn "Windows", "PowerShell"
          False  #An exact match



          # Find unapproved verbs in the functions in my module
          # -------------------------------------------
          PS C:\> $ApprovedVerbs = Get-Verb | foreach {$_.verb}
          PS C:\> $myVerbs = Get-Command -Module MyModule | foreach {$_.verb}

          PS C:\> $myVerbs | where {$_ -NotIn $ApprovedVerbs}      
          ForEach
          Sort
          Tee
          Where

-Replace

Описание: оператор замены. Изменяет указанные элементы значения.

Пример:

PS C:\> "Get-Process" -Replace "Get", "Stop"
          Stop-Process

          # Change all .GIF file name extension to .JPG
          PS C:\> dir *.gif | foreach {$_ -Replace ".gif", ".jpg"} 

ОПЕРАТОРЫ РАВЕНСТВА

Операторы равенства (-eq, -ne) возвращают значение TRUE или соответствующие элементы, если одно или несколько входных значений совпадают с указанным шаблоном. Весь шаблон должен соответствовать всему значению.

C:PS> 2 -eq 2
          True

          C:PS> 2 -eq 3
          False

          C:PS> 1,2,3 -eq 2
          2

          C:PS> "PowerShell" -eq "Shell"
          False

          C:PS> "Windows", "PowerShell" -eq "Shell"
          C:PS> 

          PS C:\> "abc", "def", "123" -eq "def"
          def
 
          PS C:\> "abc", "def", "123" -ne "def"
          abc
          123

ОПЕРАТОРЫ ВЛОЖЕНИЯ

Операторы вложения (-Contains и -NotContains) сходны с операторами равенства. Однако операторы вложения всегда возвращают логическое значение, даже если в качестве входных данных использовалась коллекция.

Кроме того, в отличие от операторов равенства, операторы вложения возвращают значение при обнаружении первого совпадения. Операторы равенства оценивают все входные данные и затем возвращают все совпадения в коллекции. В примерах ниже показано функционирование оператора -Contains.

C:PS> 1,2,3 -contains 2
          True

          C:PS> "PowerShell" -contains "Shell"
          False

          C:PS> "Windows", "PowerShell" -contains "Shell"
          False

          PS C:\> "abc", "def", "123" -contains "def"
          True

          PS C:\> "true", "blue", "six" -contains "true"
          True

В примере ниже продемонстрировано отличие операторов вложения от оператора равенства. Операторы вложения всегда возвращают значение TRUE при первом совпадении.

PS C:\> 1,2,3,4,5,4,3,2,1 -eq 2
          2
          2

          PS C:\> 1,2,3,4,5,4,3,2,1 -contains 2
          True

При обработке коллекции очень большого объема оператор -Contains возвращает результаты быстрее, чем оператор равенства.

Операторы совпадения

Операторы совпадения (-Match и -NotMatch) выполняют поиск элементов, которые соответствуют или не соответствуют указанному шаблону при использовании регулярных выражений.

Синтаксис:

<string[]> -Match <regular-expression>
          <string[]> -NotMatch <regular-expression>

Ниже показаны примеры использования оператора -Match.

PS C:\> "Windows", "PowerShell" -Match ".shell"
          PowerShell

          PS C:\> (Get-Command Get-Member -Syntax) -Match "-view"
          True

          PS C:\> (Get-Command Get-Member -Syntax) -NotMatch "-path"
          True

          PS C:\> (Get-Content Servers.txt) -Match "^Server\d\d"
          Server01
          Server02

Операторы совпадения выполняют поиск только в строках. Они не могут выполнять поиск по массивам целых чисел и другим объектам.

Операторы -Match и -NotMatch заполняют автоматическую переменную $Matches, если входные данные (аргумент с левой стороны) оператора представляют собой один скалярный объект. Если входные данные являются скалярными, операторы -Match и -NotMatch возвращают логическое значение и устанавливают в качестве значения автоматической переменной $Matches совпавшие компоненты аргумента.

Если входные данные являются коллекцией, операторы -Match и -NotMatch возвращают соответствующие элементы коллекции, но не изменяют значение переменной $Matches.

Например, приведенная ниже команда отправляет коллекцию строк в оператор -Match. Оператор -Match возвращает элементы коллекции, которые соответствуют шаблону. При этом значение автоматической переменной $Matches не изменяется.

PS C:\> "Sunday", "Monday", "Tuesday" -Match "sun"
          Sunday

          PS C:\> $matches
          PS C:\>

Напротив, приведенная ниже команда отправляет в оператор -Match одну строку. Оператор -Match возвращает логическое значение и изменяет значение автоматической переменной $Matches.

PS C:\> "Sunday" -Match "sun"
          True

          PS C:\> $matches

          Name                           Value
          ----                           -----
          0                              Sun

Оператор -NotMatch устанавливает значение автоматической переменной $Matches, если входные данные являются скалярными, а результат выполнения оператора равняется False, т. е. при обнаружении совпадения.

PS C:\> "Sunday" -NotMatch "rain"
          True

          PS C:\> $matches
          PS C:\>
          
          PS C:\> "Sunday" -NotMatch "day"
          False

          PS C:\> $matches
          PS C:\>

          Name                           Value
          ----                           -----
          0                              day

ОПЕРАТОР ЗАМЕНЫ

Оператор -Replace заменяет часть исходного значения или все значение целиком на указанное значение с использованием регулярных выражений. Оператор -Replace может оказаться полезным при выполнении многих административных задач, например при переименовании файлов. Например, приведенная ниже команда изменяет расширения всех файлов GIF на JPG.

Get-ChildItem | Rename-Item -NewName { $_ -Replace '.gif$','.jpg$' }

Ниже описан синтаксис оператора -Replace, при этом <оригинал> соответствует символам, которые необходимо заменить, а <замена> — символам, которыми необходимо заменить оригинал.

<input> <operator> <original>, <substitute> 

По умолчанию оператор -Replace не учитывает регистр символов. Для учета регистра символов используйте -cReplace. Для явного отключения учета регистра символов используйте -iReplace. Рассмотрим следующие примеры:

PS C:\> "book" -Replace "B", "C"
          Cook
          PS C:\> "book" -iReplace "B", "C" 
          Cook
          PS C:\> "book" -cReplace "B", "C"
          book
 
         PS C:\> '<command:parameter required="false" variableLength="true" globbing="false"'`
                 | foreach {$_ -replace 'globbing="false"', 'globbing="true"'}
         <command:parameter required="false" variableLength="true" globbing="true"

Побитовые операторы

Windows PowerShell поддерживает стандартные побитовые операторы, включая побитовое И (-bAnd), побитовое ИЛИ и побитовое исключающее ИЛИ (-bOr и -bXor), а также побитовое НЕ (-bNot).

Начиная с версии Windows PowerShell 2.0 все побитовые операторы работают с 64-разрядными целыми числами.

Начиная с версии Windows PowerShell 3.0 появились операторы -shr (сдвиг вправо) и -shl (сдвиг влево) для поддержки побитовых арифметических операций в Windows PowerShell.

В Windows PowerShell поддерживаются перечисленные ниже побитовые операторы.

      Operator  Description               Example  
      --------  ----------------------    -------------------
      -bAnd     Bitwise AND               PS C:\> 10 -band 3
                                          2
 
      -bOr      Bitwise OR (inclusive)    PS C:\> 10 -bor 3
                                          11    

      -bXor     Bitwise OR (exclusive)    PS C:\> 10 -bxor 3
                                          9

      -bNot     Bitwise NOT               PS C:\> -bNot 10
                                          -11

      -shl      Shift-left                PS C:\> 100 -shl 2
                                          400
 
      -shr      Shift-right               PS C:\> 100 -shr 1
                                          50

Побитовые операторы используют двоичный формат значений. Например, для числа 10 используется битовая структура 00001010 (на основе 1 байта), а для числа 3 — 00000011. При использовании побитового оператора для сравнения 10 и 3 выполняется сравнение отдельных битов в каждом байте.

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

1010      (10)
          0011      ( 3)
          --------------  bAND
          0010      ( 2)

При операции побитового ИЛИ (включающего) результирующий бит устанавливается в 1, если любой из входных битов или они оба равняются 1. Результирующий бит устанавливается в 0 только в том случае, если оба входных бита равняются 0.

1010      (10)
          0011      ( 3)
          --------------  bOR (inclusive)
          1011      (11)

При операции побитового ИЛИ (исключающего) результирующий бит устанавливается в 1 только в том случае, если один из входных битов равняется 1.

1010      (10)
          0011      ( 3)
          --------------  bXOR (exclusive)
          1001      ( 9)

Побитовый оператор НЕ — это унарный оператор, результатом выполнения которого является дополнение до двоичного значения. Бит 1 устанавливается в 0, а бит 0 устанавливается в 1.

Например, двоичным дополнением 0 является –1, т. е. максимальное целое число без знака (0xffffffff), а двоичным дополнением –1 — 0.

PS C:\> -bNOT 10
          -11


          0000 0000 0000 1010  (10)
          ------------------------- bNOT
          1111 1111 1111 0101  (-11, xfffffff5) 

В побитовой операции сдвига влево все биты перемещаются на «n» позиций влево, где «n» — значение правого операнда. Оставшиеся позиции заполняются нулями.

Если левый операнд является значением Integer (32-разрядным), 5 младших битов правого операнда определяют количество битов сдвига левого операнда.

Если левый операнд является значением Long (64-разрядным), 6 младших битов правого операнда определяют количество битов сдвига левого операнда.

PS C:\> 21 -shl 1
        42

          00010101  (21)
          00101010  (42)

        PS C:\> 21 -shl 2
        84

          00010101  (21)
          00101010  (42)
          01010100  (84)

При выполнении побитовой операции сдвига вправо все биты перемещаются на n позиций вправо, где n — это значение правого операнда. Оператор сдвига вправо (-shr) вставляет нуль в самую левую позицию, если выполняется сдвиг вправо положительного значения или значения без знака.

Если левый операнд является значением Integer (32-разрядным), 5 младших битов правого операнда определяют количество битов сдвига левого операнда.

Если левый операнд является значением Long (64-разрядным), 6 младших битов правого операнда определяют количество битов сдвига левого операнда.

        PS C:\> 21 -shr 1
        10

          00010101  (21)
          00001010  (10)

        PS C:\> 21 -shr 2
        5

          00010101  (21)
          00001010  (10)
          00000101  ( 5)

СМ. ТАКЖЕ

about_Operators

about_Regular_Expressions

about_Wildcards

Compare-Object

Foreach-Object

Where-Object