If, ElseIf, and Else
PowerShell's if statement evaluates an expression in parentheses and runs the following script block only when that expression resolves to $true. Comparison operators like -eq, -ne, -gt, -lt, -ge, and -le are used instead of symbols such as == or > because those symbols are reserved for redirection and other syntax. Chaining elseif blocks lets you test additional conditions in order, and a trailing else catches everything that didn't match.
Cricket analogy: Like an umpire checking -eq: is the ball height above the stump line (-gt) before signalling a wide, then falling through elseif checks for no-ball, then the else of a legal delivery, exactly as MS Dhoni's keeping decisions cascaded through checks in real time.
Combining Conditions with Logical Operators
Multiple conditions are combined using -and, -or, and -not (or the ! alias for -not). PowerShell short-circuits -and and -or, meaning it stops evaluating as soon as the result is determined, so ($x -ne $null -and $x.Length -gt 0) is safe even when $x might be $null. Parentheses control evaluation order explicitly, which matters once you mix -and and -or in the same expression, since -and binds tighter than -or.
Cricket analogy: Like a DRS review combining -and conditions: umpire's call -and ball-tracking hitting the stumps must both be true to overturn, the exact dual-check the third umpire applied in the 2019 World Cup final review.
The Switch Statement
The switch statement compares one value against several patterns and is often clearer than a long elseif chain. By default it matches by wildcard-like equality, but the -Regex, -Wildcard, -CaseSensitive, and -Exact switches change matching behavior, and a bare switch($value) with no flags still supports the '*' pattern to catch anything unmatched (acting like a default block) if no case name matches, or you can use the literal keyword default. Unlike if, switch continues testing every case unless you add a break, so multiple matching case blocks can all execute.
Cricket analogy: Like an umpire's signal switch on dismissal type: switch($wicket) { 'bowled' {...} 'lbw' {...} 'caught' {...} default {...} }, mirroring the distinct hand signals given for each of the ten ways to get out.
Ternary and Null-Coalescing Operators
PowerShell 7 introduced the ternary operator condition ? trueValue : falseValue as a compact alternative to a short if/else, along with ?? (null-coalescing, returns the right side only when the left is $null) and ??= (null-coalescing assignment, assigns only if the variable is currently $null). These operators reduce boilerplate for simple default-value patterns but should be avoided for anything beyond a single, easily readable expression, since nested ternaries quickly hurt readability.
Cricket analogy: Like a scoreboard operator computing result = (runsNeeded -le 0) ? 'Win' : 'Continue' in one line, the instant win/loss flip you see the moment the winning run is struck.
function Get-ShippingCost {
param(
[double]$Weight,
[string]$Destination
)
if ($Weight -le 0) {
throw "Weight must be positive."
}
elseif ($Weight -gt 50 -and $Destination -ne 'Local') {
Write-Warning "Heavy international package - manual review required."
}
$rate = switch ($Destination) {
'Local' { 5.0 }
'National' { 12.5 }
{ $_ -in 'EU', 'UK' } { 20.0 }
default { 35.0 }
}
$surcharge = ($Weight -gt 20) ? 10 : 0
$insurance = $Destination ?? 'National'
return [PSCustomObject]@{
BaseRate = $rate
Surcharge = $surcharge
Total = $rate + $surcharge
Insured = $insurance
}
}
Get-ShippingCost -Weight 25 -Destination 'EU'Comparison operators like -eq, -like, and -match are case-insensitive by default. Prefix them with 'c' (-ceq, -clike, -cmatch) to force case-sensitive comparisons, or 'i' explicitly (-ieq) if you want to document intent even though it's the default.
A single = inside an if condition is always assignment, not comparison, and PowerShell will happily let if ($x = 5) compile — it assigns 5 to $x and then evaluates $x (truthy, non-zero) as the condition, silently overwriting whatever $x held before. Always use -eq for equality checks.
- if/elseif/else branches on boolean expressions using -eq, -ne, -gt, -lt, -like, -match rather than symbolic operators.
- -and and -or short-circuit evaluation, and -and binds tighter than -or, so use parentheses to be explicit.
- switch compares one value against multiple patterns and supports -Regex, -Wildcard, and -CaseSensitive matching modes.
- switch tests every case by default (multiple matches can all run); add break to stop after the first match.
- The ternary operator (cond ? a : b) and null-coalescing ?? / ??= (PowerShell 7+) shorten simple conditional assignments.
- Comparisons are case-insensitive unless you use the 'c' prefixed operators like -ceq or -cmatch.
- Using = instead of -eq inside a condition is a silent assignment bug, not a syntax error.
Practice what you learned
1. Which operator does PowerShell use to test for equality inside an if statement?
2. By default, are PowerShell comparison operators like -eq case-sensitive or case-insensitive?
3. What happens in a switch statement if two case blocks both match the value and neither contains break?
4. What does the ?? operator return if the left-hand operand is not $null?
5. Why is `if ($x = 5) { ... }` dangerous in PowerShell?
Was this page helpful?
You May Also Like
Loops in PowerShell
Master PowerShell's iteration constructs — foreach, for, while, do-while, and pipeline-based ForEach-Object — along with break and continue for controlling repetition.
Functions and Parameters
Learn to write reusable PowerShell functions with typed, validated, pipeline-aware parameters, and understand how advanced functions behave like native cmdlets.
Error Handling with Try/Catch
Understand PowerShell's terminating vs non-terminating errors and how try/catch/finally, -ErrorAction, and $ErrorActionPreference work together to handle failures gracefully.
Related Reading
Related Study Notes in Programming
Browse all study notesApache Spark Study Notes
Programming · 30 topics
ProgrammingApache Flink Study Notes
Programming · 30 topics
ProgrammingHadoop Study Notes
Programming · 30 topics
ProgrammingSnowflake Study Notes
Programming · 30 topics
ProgrammingApache Airflow Study Notes
Programming · 30 topics
Programmingdbt (Data Build Tool) Study Notes
Programming · 30 topics