About Comparison Operators
Short description
Describes the operators that compare values in PowerShell.
Long description
Comparison operators let you specify conditions for comparing values and finding values that match specified patterns. To use a comparison operator, specify the values that you want to compare together with an operator that separates these values.
PowerShell includes the following comparison operators:
Type | Operators | Description |
---|---|---|
Equality | -eq | equals |
-ne | not equals | |
-gt | greater than | |
-ge | greater than or equal | |
-lt | less than | |
-le | less than or equal | |
Matching | -like | Returns true when string matches wildcard |
pattern | ||
-notlike | Returns true when string does not match | |
wildcard pattern | ||
-match | Returns true when string matches regex | |
pattern; $matches contains matching strings | ||
-notmatch | Returns true when string does not match | |
regex pattern; $matches contains matching | ||
strings | ||
Containment | -contains | Returns true when reference value contained |
in a collection | ||
-notcontains | Returns true when reference value not | |
contained in a collection | ||
-in | Returns true when test value contained in a | |
collection | ||
-notin | Returns true when test value not contained | |
in a collection | ||
Replacement | -replace | Replaces a string pattern |
Type | -is | Returns true if both object are the same |
type | ||
-isnot | Returns true if the objects are not the same | |
type |
By default, all comparison operators are case-insensitive. To make a
comparison operator case-sensitive, precede the operator name with a c
. For
example, the case-sensitive version of -eq
is -ceq
. To make the
case-insensitivity explicit, precede the operator with an i
. For example,
the explicitly case-insensitive version of -eq
is -ieq
.
When the input to an operator is a scalar value, comparison operators return a Boolean value. When the input is a collection of values, the comparison operators return any matching values. If there are no matches in a collection, comparison operators do not return anything.
The exceptions are the containment operators (-contains
, -notcontains
),
the In operators (-in
, -notin
), and the type operators (-is
, -isnot
),
which always return a Boolean value.
Equality Operators
The equality operators (-eq
, -ne
) return a value of TRUE or the matches
when one or more of the input values is identical to the specified pattern.
The entire pattern must match an entire value.
Example:
-eq
Description: Equal to. Includes an identical value.
Example:
C:PS> 2 -eq 2
True
C:PS> 2 -eq 3
False
C:PS> 1,2,3 -eq 2
2
PS> "abc" -eq "abc"
True
PS> "abc" -eq "abc", "def"
False
PS> "abc", "def" -eq "abc"
abc
-ne
Description: Not equal to. Includes a different value.
Example:
PS> "abc" -ne "def"
True
PS> "abc" -ne "abc"
False
PS> "abc" -ne "abc", "def"
True
PS> "abc", "def" -ne "abc"
def
-gt
Description: Greater-than.
Example:
PS> 8 -gt 6
True
PS> 7, 8, 9 -gt 8
9
Note
This should not to be confused with >
, the greater-than operator in many other programming languages. In PowerShell, >
is used for redirection. For more information, see About_redirection.
-ge
Description: Greater-than or equal to.
Example:
PS> 8 -ge 8
True
PS> 7, 8, 9 -ge 8
8
9
-lt
Description: Less-than.
Example:
PS> 8 -lt 6
False
PS> 7, 8, 9 -lt 8
7
-le
Description: Less-than or equal to.
Example:
PS> 6 -le 8
True
PS> 7, 8, 9 -le 8
7
8
Matching Operators
The like operators (-like
and -notlike
) find elements that match or do not
match a specified pattern using wildcard expressions.
The syntax is:
<string[]> -like <wildcard-expression>
<string[]> -notlike <wildcard-expression>
The match operators (-match
and -notmatch
) find elements that match or do
not match a specified pattern using regular expressions.
The match operators populate the $Matches
automatic variable when the input
(the left-side argument) to the operator is a single scalar object. When the
input is scalar, the -match
and -notmatch
operators return a Boolean value
and set the value of the $Matches
automatic variable to the matched
components of the argument.
The syntax is:
<string[]> -match <regular-expression>
<string[]> -notmatch <regular-expression>
-like
Description: Match using the wildcard character (*).
Example:
PS> "PowerShell" -like "*shell"
True
PS> "PowerShell", "Server" -like "*shell"
PowerShell
-notlike
Description: Does not match using the wildcard character (*).
Example:
PS> "PowerShell" -notlike "*shell"
False
PS> "PowerShell", "Server" -notlike "*shell"
Server
-match
Description: Matches a string using regular expressions. When the input is
scalar, it populates the $Matches
automatic variable.
The match operators search only in strings. They cannot search in arrays of integers or other objects.
If the input is a collection, the -match
and -notmatch
operators return
the matching members of that collection, but the operator does not populate
the $Matches
variable.
For example, the following command submits a collection of strings to the
-match
operator. The -match
operator returns the items in the collection
that match. It does not populate the $Matches
automatic variable.
PS> "Sunday", "Monday", "Tuesday" -match "sun"
Sunday
PS> $Matches
PS>
In contrast, the following command submits a single string to the -match
operator. The -match
operator returns a Boolean value and populates the
$Matches
automatic variable. The $Matches
automatic variable is a
Hashtable. If no grouping or capturing is used, only one key is populated.
The 0
key represents all text that was matched. For more information about
grouping and capturing using regular expressions, see
about_Regular_Expressions.
PS> "Sunday" -match "sun"
True
PS> $Matches
Name Value
---- -----
0 Sun
It is important to note that the $Matches
hashtable will only contain the
first occurrence of any matching pattern.
PS> "Banana" -match "na"
True
PS> $Matches
Name Value
---- -----
0 na
Important
The 0
key is an Integer. You can use any Hashtable method to access
the value stored.
PS> "Good Dog" -match "Dog"
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
The -notmatch
operator populates the $Matches
automatic variable when the
input is scalar and the result is False, that it, when it detects a match.
PS> "Sunday" -notmatch "rain"
True
PS> $matches
PS>
PS> "Sunday" -notmatch "day"
False
PS> $matches
Name Value
---- -----
0 day
-notmatch
Description: Does not match a string. Uses regular expressions. When the input
is scalar, it populates the $Matches
automatic variable.
Example:
PS> "Sunday" -notmatch "sun"
False
PS> $matches
Name Value
---- -----
0 sun
PS> "Sunday", "Monday" -notmatch "sun"
Monday
Containment Operators
The containment operators (-contains
and -notcontains
) are similar to the
equality operators. However, the containment operators always return a Boolean
value, even when the input is a collection.
Also, unlike the equality operators, the containment operators return a value as soon as they detect the first match. The equality operators evaluate all input and then return all the matches in the collection.
-contains
Description: Containment operator. Tells whether a collection of reference values includes a single test value. Always returns a Boolean value. Returns TRUE only when the test value exactly matches at least one of the reference values.
When the test value is a collection, the Contains operator uses reference equality. It returns TRUE only when one of the reference values is the same instance of the test value object.
In a very large collection, the -contains
operator returns results quicker
than the equal to operator.
Syntax:
<Reference-values> -contains <Test-value>
Examples:
PS> "abc", "def" -contains "def"
True
PS> "Windows", "PowerShell" -contains "Shell"
False #Not an exact match
# Does the list of computers in $DomainServers include $ThisComputer?
PS> $DomainServers -contains $thisComputer
True
PS> "abc", "def", "ghi" -contains "abc", "def"
False
PS> $a = "abc", "def"
PS> "abc", "def", "ghi" -contains $a
False
PS> $a, "ghi" -contains $a
True
-notcontains
Description: Containment operator. Tells whether a collection of reference values includes a single test value. Always returns a Boolean value. Returns TRUE when the test value is not an exact matches for at least one of the reference values.
When the test value is a collection, the NotContains operator uses reference equality.
Syntax:
<Reference-values> -notcontains <Test-value>
Examples:
PS> "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> $ApprovedVerbs = Get-Verb | foreach {$_.verb}
PS> $myVerbs = Get-Command -Module MyModule | foreach {$_.verb}
PS> $myVerbs | where {$ApprovedVerbs -notcontains $_}
ForEach
Sort
Tee
Where
-in
Description: In operator. Tells whether a test value appears in a collection of reference values. Always return as Boolean value. Returns TRUE only when the test value exactly matches at least one of the reference values.
When the test value is a collection, the In operator uses reference equality. It returns TRUE only when one of the reference values is the same instance of the test value object.
The -in
operator was introduced in PowerShell 3.0.
Syntax:
<Test-value> -in <Reference-values>
Examples:
PS> "def" -in "abc", "def"
True
PS> "Shell" -in "Windows", "PowerShell"
False #Not an exact match
PS> "Windows" -in "Windows", "PowerShell"
True #An exact match
PS> "Windows", "PowerShell" -in "Windows", "PowerShell", "ServerManager"
False #Using reference equality
PS> $a = "Windows", "PowerShell"
PS> $a -in $a, "ServerManager"
True #Using reference equality
# Does the list of computers in $DomainServers include $ThisComputer?
PS> $thisComputer -in $domainServers
True
-notin
Description: Tells whether a test value appears in a collection of reference values. Always returns a Boolean value. Returns TRUE when the test value is not an exact match for at least one of the reference values.
When the test value is a collection, the In operator uses reference equality. It returns TRUE only when one of the reference values is the same instance of the test value object.
The -notin
operator was introduced in PowerShell 3.0.
Syntax:
<Test-value> -notin \<Reference-values>
Examples:
PS> "def" -notin "abc", "def"
False
PS> "ghi" -notin "abc", "def"
True
PS> "Shell" -notin "Windows", "PowerShell"
True #Not an exact match
PS> "Windows" -notin "Windows", "PowerShell"
False #An exact match
# Find unapproved verbs in the functions in my module
PS> $ApprovedVerbs = Get-Verb | foreach {$_.verb}
PS> $MyVerbs = Get-Command -Module MyModule | foreach {$_.verb}
PS> $MyVerbs | where {$_ -notin $ApprovedVerbs}
ForEach
Sort
Tee
Where
Replacement Operator
The -replace
operator replaces all or part of a value with the specified
value using regular expressions. You can use the -replace
operator for many
administrative tasks, such as renaming files. For example, the following
command changes the file name extensions of all .txt files to .log:
Get-ChildItem *.txt | Rename-Item -NewName { $_.name -replace '\.txt$','.log' }
The syntax of the -replace
operator is as follows, where the <original>
placeholder represents the characters to be replaced, and the <substitute>
placeholder represents the characters that will replace them:
<input> <operator> <original>, <substitute>
By default, the -replace
operator is case-insensitive. To make it case
sensitive, use -creplace
. To make it explicitly case-insensitive, use
-ireplace
.
Consider the following examples:
PS> "book" -replace "B", "C"
Cook
"book" -ireplace "B", "C"
Cook
"book" -creplace "B", "C"
book
It is also possible to use regular expressions to dynamically replace text using capturing groups, and substitutions. For more information, see about_Regular_Expressions.
Type comparison
The type comparison operators (-is
and -isnot
) are used to determine if an
object is a specific type.
-is
Syntax:
<object> -is <type reference>
Example:
PS> $a = 1
PS> $b = "1"
PS> $a -is [int]
True
PS> $a -is $b.GetType()
False
-isnot
Syntax:
<object> -isnot <type reference>
Example:
PS> $a = 1
PS> $b = "1"
PS> $a -isnot $b.GetType()
True
PS> $b -isnot [int]
True