Windows IT Pro is the leading independent community for IT professionals deploying Microsoft Windows server and client applications and technologies.
  
  
  Advanced Search 


November 2008

Controlling Your Code's Flow with PowerShell's Conditional Statements

Lesson 2 in the PowerShell 201 series explores how to use the if, for, and while statements
RSS
Subscribe to Windows IT Pro | See More Systems Administration Articles Here | Reprints | Or get the Monthly Online Pass—only $5.95 a month!

Download the Code Here

As Listing 1, demonstrates, you can embed if statements in the script block of another if statement, but you aren’t limited to embedding only these types of statements. You can, for example, embed a foreach statement in an if statement’s script block, as shown in Listing 2. The foreach statement runs only when the if statement’s conditional code block evaluates to true. In other words, when the folder contains text files, the foreach statement will loop through those text files. Each time a loop runs, foreach returns the text file’s size, as Figure 1, shows.

The for Statement
In Lesson 1, I showed you how to implement foreach loops to iterate through a collection. You can also use for statements to loop through collections. A for statement implements a counting loop that iterates through a collection as long as the condition is true. Like if statements, for statements include a conditional code block and a script block. However, the for statement’s conditional code block is more complex.

Let’s take a look at a simple example. The following for statement displays the values assigned to the $a variable:

for ($a = 1; $a -le 5; $a++) {$a}

The statement begins with the keyword for, followed by the conditional code block ($a = 1; $a -le 5; $a++). The for statement’s conditional code block is made up of three parts, which are separated by semicolons. The first part ($a = 1) initializes the $a variable with the value 1. The $a variable provides a base value, or starting value, for the other code block elements.

The second part ($a -le 5) is the condition itself. In this case, the value in $a must be less than 5 to evaluate to true. The third part ($a++) increments $a by 1 at the end of each loop. As a result, the statement will continue to step through the collection as long as the value in $a is less than or equal to 5. When $a equals 6, the for statement ends. Figure 2 shows sample output from this statement.

In some cases, you won’t know the number of elements in a collection. The code in Listing 3 demonstrates how you can use a for statement to iterate through such collections. This code begins by storing a collection of text files in the $files variable. The if statement uses the $files variable and its Count property ($files.count) to check the file count. As I mentioned previously, if there’s only one file in the collection, PowerShell returns an object (i.e., a System .IO.FileSystemInfo object) that has a scalar value. If there are no files, PowerShell doesn’t return an object. In either case, the Count property doesn’t exist. As a result, you receive a null value if you try to call the Count property, which is why you can use it as a condition in the if statement.

When $files.count returns a null value, the elseif clause in callout B checks for the condition of there being only one file. If this condition isn’t met, there are no files and the else clause in callout C runs.

When $files.count doesn’t return a null value (i.e., PowerShell returns a System .Array object so the Count property exists), the code in callout A runs because there are at least two files. In callout A, the embedded for statement’s conditional code block uses the Count property to determine the exact number of files (i.e., elements) in the collection. As long as $i is less than the number of elements, the condition evaluates to true.

Note that I initialize $i to 0. I use 0 because collections (such as $files) use base 0 indexing. In the script block, I use $i to specify which element to retrieve from the collection. For instance, during the first loop, $i is set to 0. This means that $files[$i] is the same as $files[0]. On the second loop, $i equals 1, so the value becomes $files[1], and so on. Figure 3 shows sample results from the code in Listing 3.

One other item worth pointing out is that you can declare and initialize the base variable before the for statement. For example, in Listing 4, the $i variable is declared and initialized in the line highlighted by callout A. As you can see, the code is easier to read with this setup.

The while Statement
Like the for statement, the while statement is a type of loop that iterates through a collection. The while statement, which consists of a conditional code block and a script block, continues as long as the conditional code block evaluates to true. The following code provides a simple example of how this works:
$count = 0
while ($count -lt 5)
{
  $count++
  "The count is
  $count."
}

The first line of code initializes the $count variable to 0. This variable is used as a base or starting value for the looping. The conditional code block ($count -lt 5) specifies that $count must be less than 5.

When the conditional code block evaluates to true, the script block runs. The first statement in the script block increments $count by 1. The second statement outputs a string that displays the running value in $count, as shown in the results:

The count is 1.
The count is 2.
The count is 3.
The count is 4.
The count is 5.

Note that when $count is 4 in the conditional code block, the script block increments $count by 1 and displays a value of 5 in the output. It’s not until the next time through the loop that the conditional code block evaluates to false, ending the while loop.

Sometimes you might not know the number of elements in a collection that’s being iterated through with a while loop. In this situation, you can use the Count property to retrieve that value:

$proc = Get-Process
$count = 0
while ($count -lt
$proc.count)
{
  "The " +
    $proc[$count].name +
    " process uses " +
    $proc[$count].handles +
    " handles."
  $count ++
}

This code first assigns the results of the Get-Process cmdlet to the $proc variable. This cmdlet returns a list of processes running on the local system. The conditional code block in the while loop specifies that the value in $count must be less than the total number of processes ($proc.count). Figure 4 shows sample results from running this code. As you can see, you can use the $proc variable to retrieve not only the number of processes but also each process’s name and number of handles.

Moving Forward
In this lesson, you learned about the if, for, and while statements. These statements, along with the foreach statement and ForEach-Object cmdlet discussed in Lesson 1, provide a wide range of tools for implementing flow-control statements. You should try out all these statements and try to combine them in different ways, such as adding if statements to foreach statements. The more comfortable you become with using these statements, the better you’ll understand them and be able to implement them in your code.

End of Article

   Previous  1  [2]  Next  


Reader Comments

You must be a registered user or online subscriber to comment on this article. Please log on before posting a comment. Are you a new visitor? Register now




Learning Path To read the previous lesson in the PowerShell 201 series, go to
"Iterating Through Collections with PowerShell's foreach Loops"


Top Viewed ArticlesView all articles
WinInfo Short Takes: Week of November 9, 2009

An often irreverent look at some of the week's other news, including some more Windows 7 sales momentum, some Sophos stupidity, Microsoft's cloud computing self-loathing, more whining from the browser makers, Zoho's "Fake Office," and much, much more ...

Command Prompt Tricks

One reader shares his tip for setting up the command prompt to reflect a remote path. ...

Windows 7 Sets Sales Record

Microsoft CEO Steve Ballmer described Windows 7's first ten days of sales as "fantastic" while in Japan yesterday. ...


Related Articles Managing AD User Accounts with PowerShell

PowerShell 101, Lesson 5

PowerShell 101, Lesson 3

Essential Windows PowerShell Commands

Scripting Whitepapers From Development to Production: Streamlining SharePoint Deployment with DocAve Deployment Manager

Related Events WinConnections and Microsoft® Exchange Connections

Deep Dive into Windows Server 2008 R2 presented by John Savill

Check out our list of Free Email Newsletters!

Scripting eBooks Keeping Your Business Safe from Attack: Encryption and Certificate Services

Best Practices for Managing Linux and UNIX Servers

Building an Effective Reporting System

Related Scripting Resources Introducing Left-Brain.com, the online IT bookstore
Looking for books, CDs, toolkits, eBooks? Prime your mind at Left-Brain.com

Discover Windows IT Pro eLearning Series!
Clear & detailed technical information and helpful how-to's, all in our trademark no-nonsense format


Windows IT Pro Home Register FAQ for Windows WinInfo News
Europe Edition About Us Contact Us/Customer Service Media Kit Affiliates / Licensing  
SQL Server Magazine Office & SharePoint Pro DevProConnections IT Job Hound
Left-Brain.com Technology Resource Directory asp.netPRO ITTV Windows SuperSite 
 
 Windows IT Pro is a Division of Penton Media Inc.
 © 2009 Penton Media, Inc. Terms of Use | Privacy Statement