PowerShell By Example: Case Sensitivity

PowerShell is case-insensitive by default. This means that commands, variable names, string comparisons, and operators all work regardless of upper or lower case. However, there are many situations where case sensitivity matters, and PowerShell provides explicit ways to control it.


Comparison Operators

All of PowerShell’s comparison operators come in three flavors:

VariantPrefixBehavior
DefaultnoneCase-insensitive
Case-insensitiveiExplicitly case-insensitive
Case-sensitivecExplicitly case-sensitive

Equality (-eq)

# Default (case-insensitive)
"PowerShell" -eq "powershell"   # True
"PowerShell" -ieq "powershell"  # True (explicit)
"PowerShell" -ceq "powershell"  # False (case-sensitive)

Result:

True
True
False

Inequality (-ne)

"PowerShell" -ne "powershell"   # False
"PowerShell" -ine "powershell"  # False (explicit)
"PowerShell" -cne "powershell"  # True (case-sensitive)

Result:

False
False
True

Wildcard Matching (-like)

The -like operator supports * and ? wildcards and is also case-insensitive by default.

"Hello World" -like "hello*"    # True
"Hello World" -ilike "hello*"   # True (explicit)
"Hello World" -clike "hello*"   # False (case-sensitive)
"Hello World" -clike "Hello*"   # True

Result:

True
True
False
True

Similarly, -notlike, -inotlike, and -cnotlike follow the same pattern.


Regular Expression Matching (-match)

The -match operator tests a string against a regex pattern and is case-insensitive by default.

"PowerShell" -match "powershell"    # True
"PowerShell" -imatch "powershell"   # True (explicit)
"PowerShell" -cmatch "powershell"   # False (case-sensitive)
"PowerShell" -cmatch "PowerShell"   # True

Result:

True
True
False
True

See the Regular Expressions page for more detail on regex patterns.


Contains and In Operators

The -contains and -in operators check for membership in a collection and are case-insensitive by default.

$fruits = @("Apple", "Banana", "Cherry")

$fruits -contains "apple"    # True
$fruits -icontains "apple"   # True (explicit)
$fruits -ccontains "apple"   # False (case-sensitive)
$fruits -ccontains "Apple"   # True

"banana" -in $fruits         # True
"banana" -cin $fruits        # False (case-sensitive)

Result:

True
True
False
True
True
False

Switch Statement

The switch statement is case-insensitive by default. Use the -CaseSensitive parameter to enforce case sensitivity.

$value = "Hello"

# Case-insensitive (default)
switch ($value) {
    "hello" { "Matched (case-insensitive)" }
    "HELLO" { "Also matched" }
}

Result:

Matched (case-insensitive)
Also matched
# Case-sensitive
switch -CaseSensitive ($value) {
    "hello" { "Lowercase match" }
    "Hello" { "Exact match" }
    "HELLO" { "Uppercase match" }
}

Result:

Exact match

See the Switch page for more examples.


Select-String

Select-String searches for text in strings or files. By default it is case-insensitive. Add -CaseSensitive to change this.

$lines = @(
    "Error: disk full",
    "error: permission denied",
    "WARNING: low memory",
    "Info: service started"
)

# Case-insensitive (default)
$lines | Select-String "error"

Result:

Error: disk full
error: permission denied
# Case-sensitive: only exact case matches
$lines | Select-String -CaseSensitive "error"

Result:

error: permission denied

Sort-Object

Sort-Object sorts in case-insensitive order by default. Use -CaseSensitive to distinguish between uppercase and lowercase values.

$names = @("Banana", "apple", "Cherry", "cherry", "Apple", "banana")

# Case-insensitive (default)
$names | Sort-Object

Result:

apple
Apple
Banana
banana
Cherry
cherry
# Case-sensitive: uppercase letters sort before lowercase
$names | Sort-Object -CaseSensitive

Result:

apple
Apple
banana
Banana
cherry
Cherry

See the Sorting page for more sorting examples.


Hashtables

Hashtable keys in PowerShell are case-insensitive by default. This means $ht["Key"] and $ht["key"] refer to the same entry.

$ht = @{ Name = "Alice"; Age = 30 }

$ht["name"]   # Alice
$ht["NAME"]   # Alice
$ht["Name"]   # Alice

Result:

Alice
Alice
Alice

To create a case-sensitive hashtable, use a Dictionary with StringComparer.Ordinal.

$caseSensitive = [System.Collections.Generic.Dictionary[string,object]]::new(
    [System.StringComparer]::Ordinal
)
$caseSensitive["Key"] = "Uppercase K"
$caseSensitive["key"] = "Lowercase k"

$caseSensitive["Key"]   # Uppercase K
$caseSensitive["key"]   # Lowercase k

Result:

Uppercase K
Lowercase k

See the Hashtables page for more examples.


Summary

FeatureDefaultCase-sensitive option
-eq, -ne, -gt, -ltCase-insensitiveAdd c prefix: -ceq, -cne
-like, -notlikeCase-insensitiveAdd c prefix: -clike, -cnotlike
-match, -notmatchCase-insensitiveAdd c prefix: -cmatch, -cnotmatch
-contains, -inCase-insensitiveAdd c prefix: -ccontains, -cin
switchCase-insensitive-CaseSensitive parameter
Select-StringCase-insensitive-CaseSensitive parameter
Sort-ObjectCase-insensitive-CaseSensitive parameter
Hashtable keysCase-insensitiveUse StringComparer.Ordinal