Contents

PowerShell Switch Statement - Different take on branching

Contents

One switch statement can replace multiple if/else statements, it makes code more readable and is really easy to use - there’s no reason why you shouldn’t give it a try!

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# Link to the video: https://youtu.be/EqJ0lBO1rM4

# Documentation: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_switch?view=powershell-7.1

# Basic version

<#
switch ( test-value ) {
    condition {do-stuff}
    another condition {do-stuff}
}
#>

# This will print out Green
switch (2) {
    0 { "Blue" }
    1 { "Yellow"}
    2 { "Green"}
    3 { "Red"}
}

# Work with variable
$number = 1
switch ($number) {
    0 { "Blue" }
    1 { "Yellow"}
    2 { "Green"}
    3 { "Red"}
}

# Assign variables within scriptblock 
$number = 3
switch ($number) {
    0 { $result = "Blue" }
    1 { $result = "Yellow"}
    2 { $result = "Green"}
    3 { $result = "Red"}
}
Write-Host "The result is: $result" -ForegroundColor $result

# We can also assign statement to variable
$number = 0
$result = switch ($number) {
    0 { "Blue" }
    1 { "Yellow"}
    2 { "Green"}
    3 { "Red"}
}
Write-Host "The result is: $result" -ForegroundColor $result

#  Use default in case there's no match
$number = 8
$result = switch ($number) {
    0 { "Blue" }
    1 { "Yellow"}
    2 { "Green"}
    3 { "Red"}
    default {  
        Write-Warning "Unknown value, defaulting to White"
        "White" }
}
Write-Host "The result is: $result" -ForegroundColor $result

# Strings can also be matched
# This also shows working on expression
switch ( (Get-Host).Name ) {
    "Visual Studio Code Host" { "You are using VS CODE" }
    "ConsoleHost" { "You are using Console!" }
    default {"Unknown host $_"}
}

# Arrays!
$employees = @("Developer", "Project Manager", "DevOps Engineer", "Developer", "Sysadmin")
switch ($employees) {
    "Developer" {"We need a Developer!"}
    "Project Manager" {"We need Project Manager"}
    "DevOps Engineer" {"We need DevOps Engineer"}
    "Sysadmin" {"We need Sysadmin"}
}

# Using script block, when comparing value
$age = 25
switch ($age) {
    {$_ -ge 18} {
        "It's an adult"
    }

    {$_ -lt 18} {
        "It's not an adult"
    }
}

# PowerShell will match multiple times
switch ("something") {
    "something" {"This is lower case"}
    "SOMETHING" {"This is upper case"}
    "SomeTHinG" {"This is mixed"}
}

# Stop execution with break
switch ("something") {
    "something" {"This is lower case"}
    "SOMETHING" {"This is upper case" 
                    break}
    "SomeTHinG" {"This is mixed"}
}

# Make test case sensitive
switch -CaseSensitive ("something") {
    "something" {"This is lower case"}
    "SOMETHING" {"This is upper case"; break;}
    "SomeTHinG" {"This is mixed"}
}

# Enable wildcard
switch -Wildcard ("Kamil") {
    "*Anna*" {"There's notification for Anna"}
    "*John*" {"There's notification for John"}
    "*Kamil*" {"There's notification for Kamil"}
    default {"Unknown"}
}

# Enable Regex
switch -Regex ("Kamil") {
    "^Anna" {"There's notification for Anna"}
    "^John" {"There's notification for John"}
    "^Kamil" {"There's notification for Kamil"}
    default {"Unknown"}
}