Introduction to Windows PowerShell's Switch Parameter
Whenever I add a 'Switch' parameter to my script, I think - 'good job'. And I follow up by saying: 'Why don't I use the Switch construction more often?' As with other scripting languages,
PowerShell provides a variety of commands to perform branching logic. For simple cases, with few options, the 'If' construction works well. The difficult arises when 'If' becomes a
victim of its own success and you have 5 or 6 options, for that
situation it is more efficient to use PowerShell's 'Switch' command. Incidentally, the
equivalent of 'Switch' in VBScript is 'Select Case'.
It is likely that your real-life task for Switch will be trickier than
the following simple examples. However, it is worth studying a range
of basic examples to get a feel for the structure and the rhythm of the command.
A curious feature of the construction is that the word 'Switch' introduces the input, and is then never seen again,
all that you see thereafter is rows of patterns and matching
{Statement Blocks}. Also observe that there is an extra pair of {braces}
surrounding the whole pattern section.
The layout below emphasises the branches, or the multiple 'Patterns' whose values
get switched to their respective {Blocks}.
A difficulty occurred when we interrogated the computer's disks with WMI.
Specifically, the output reports DriveType as a number, whereas we want a meaningful name for the type of disk. The extra step in this example was to research which drive type corresponded to which
number, for example if $Drive.DeviceID returns a value of 3, that means the disk type is a "Hard drive".
Case Study 1 - Problem with output
# Case Study 1 - Problem $Disk = Get-WmiObject win32_logicaldisk
foreach ($Drive in $Disk) {
$Drive.DeviceID + $Drive.DriveType
}
We want an answer to the question: 'What does the DriveType number
mean?' It would be useful if the script gave us a name rather than a
number. Research reveals that there are at least 5 possible
disk types, therefore multiple 'If' statements would be cumbersome, 'Switch' is more
elegant.
Guy
Recommends: WMI Monitor and It's Free!
Windows Management Instrumentation (WMI) is one of the hidden
treasures of Microsoft operating systems. Fortunately, Solarwinds
have created a
Free WMI Monitor so that you can discover these gems of performance
information, and thus improve your PowerShell scripts. Take the guess work out of which WMI counters to use when scripting the
operating system, Active Directory or Exchange Server.
Note 1: Before examining the solution in Case
Study 2, take the time to understand the underlying WmiObject construction
in Case Study 1. In particular
observe the format: foreach (condition) {Block Command}.
Note 2: The case study solution builds on the first
script by adding the Switch block. To my way of thinking, there are
two loops, the outer foreach and an inner Switch loop. Check what I
mean by matching the last two {lonely} braces with their opening
counterparts.
Challenges
Challenge 1: Just to get experience and control of
the script try changing "Hard Drive" to "Fixed Disk"
Challenge 2: Create a mapped network drive, then
run the script again. Launch Windows Explorer then click on the Tools
menu, this is the easiest way to map a local drive letter to a UNC share.
Learning More About PowerShell's Switch Parameter
When I wanted help about the switch command, at first PowerShell's help did not do what I wanted. The secret was
to add
the about_ prefix. Try:
help about_switch
What the about_switch help file reveals is that you could use wildcards
in the matching clause.
Incidentally, PowerShell supports a whole family of about_ commands, for example you
could try:
help about_foreach
Guy Recommends: A Free Trial of the Network Performance Monitor
(NPM)
Solarwinds'
Orion performance monitor
will help you discover what's happening on your network. This
utility will also guide you through troubleshooting; the dashboard will
indicate whether the root cause is a broken link, faulty equipment or
resource overload.
Perhaps the NPM's best feature is the way it suggests solutions to network
problems. Its
second best feature is the ability to monitor the health of individual VMWare
virtual machines. If you are interested in troubleshooting, and creating network maps, then I recommend that you take advantage of Solarwinds' offer.
Case Study 2 - Count the types of error message in the
Application eventlog
# PowerShell Switch script to count eventlog messages function EventType{ BEGIN { $errors = 0 $warnings = 0 $info =
0 } PROCESS { switch -wildcard ($_.entrytype) { "err*"
{$errors++} "warn*" {$warnings++} "info*" {$info++} default {}
}#switch block }#process block END { "The Application log contains " +
$errors + " error messages." "The Application log contains " + $warnings + "
warning messages." "The Application log contains " + $info + " information
messages." }#end block }#function block Get-eventlog "application"
-newest 250 | EventType
Note 1: Observe the -wildcard switch with err*, info*
and warn*. To test the effect, try removing the -wildcard parameter.
»
Summary of PowerShell's 'Switch' Parameter
The 'If' family are easy to use for scripts that require branching logic. However, when the number of options exceeds about 5,
then 'Switch' is easier to code and easier to add more options. By trying a few simple examples you will soon appreciate the types of bracket, and the structure of the pattern with its matching
statement block. I say again, 'Switch' is one of the most satisfying constructions to create, therefore never miss a chance to replace multiple 'If's with one 'Switch'.
If you like this page then please share it with your friends
Please email me if you have a better example script. Also please report any factual mistakes, grammatical errors or broken links, I will be happy to correct the fault.
Windows Management Instrumentation (WMI) is one of the hidden
treasures of Microsoft operating systems.
Fortunately, Solarwinds
have created the
Free WMI Monitor so that you can actually see and understand these gems of
performance information. Take the guess work out of which
WMI counters to use for applications like Microsoft Active Directory,
SQL or Exchange Server.