100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Programming

Conditionals in PowerShell

Learn how PowerShell evaluates true/false logic with if/elseif/else, switch statements, and comparison/logical operators to control which code actually runs.

Control Flow & FunctionsBeginner8 min readJul 10, 2026
Analogies

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.

powershell
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

Was this page helpful?

Topics covered

#Programming#PowerShellStudyNotes#ConditionalsInPowerShell#Conditionals#PowerShell#ElseIf#Else#StudyNotes#SkillVeris#ExamPrep