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!
# 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"}
}