As we move away from simply running commands and move into writing full blown scripts, you will need a temporary place to store data. This is where variables come in.
Be sure to read the previous articles in the series:
- Learn How to Automate Windows with PowerShell
- Learning to Use Cmdlets in PowerShell
- Learning How to Use Objects in PowerShell
- Learning Formatting, Filtering and Comparing in PowerShell
- Learn to Use Remoting in PowerShell
- Using PowerShell to Get Computer Information
- Working with Collections in PowerShell
And stay tuned for the rest of the series all week.
Most programming languages allow the use of variables, which are simply containers which hold values. In PowerShell, we too have variables and they are really easy to use. Here is how to create a variable called “FirstName” and give it the value “Taylor”.
$FirstName = “Taylor”
The first thing most people seem to ask is why we put a dollar sign in front of the variables name, and that is actually a very good question. Really, the dollar sign is just a little hint to the shell that we want to access the contents of the variable (think what’s inside the container) and not the container itself. In PowerShell, variable names do not include the dollar sign, meaning that in the above example the variables name is actually “FirstName”.
In PowerShell, you can see all the variables you have created in the variable PSDrive.
Which means you can delete a variable from the shell at anytime too:
Variables don’t have to contain a single object either; you can just as easily store multiple objects in a variable. For example, if you wanted to store a list of running processes in a variable, you can just assign it the output of Get-Process.
$Proc = Get-Process
The trick to understanding this is to remember that the right hand side of the equals sign is always evaluated first. This means that you can have an entire pipeline on the right hand side if you want to.
$CPUHogs = Get-Process | Sort CPU -Descending | select -First 3
The CPUHogs variable will now contain the three running processes using the most CPU.
When you do have a variable holding a collection of objects, there are some things to be aware of. For example, calling a method on the variable will cause it to be called on each object in the collection.
Which would kill all three process in the collection. If you want to access a single object in the variable, you need to treat it like an array.
Doing that will give you the first object in the collection.
Don’t Get Caught!
Variables in PowerShell are weakly typed by default meaning they can contain any kind of data, this seems to catch new comers to PowerShell all the time!
$a = 10
$b = ‘20’
So we have two variables, one contains a string and the other an integer. So what happens if you add them? It actually depends on which order you add them in.
$a + $b = 30
$b + $a = 2010
In the first example, the first operand is an integer, $a, so PowerShell thinks thinks that you are trying to do math and therefore tries to convert any other operands into integers as well. However, in the second example the first operand is a string, so PowerShell just converts the rest of the operands to strings and concatenates them. More advanced scripters prevent this kind of gotcha by casting the variable to the type they are expecting.
[int]$Number = 5
[int]$Number = ‘5’
The above will both result in the Number variable containing an integer object with a value of 5.
Input and Output
Because PowerShell is meant to automate things, you’re going to want to avoid prompting users for information wherever possible. With that said, there are going to be times where you can’t avoid it, and for those times we have the Read-Host cmdlet. Using it is really simple:
$FirstName = Read-Host –Prompt ‘Enter your first name’
Whatever you enter will then be saved in the variable.
Writing output is just as easy with the Write-Output cmdlet.
Write-Output “How-To Geek Rocks!”
Join us tomorrow where we tie everything we have learned together!
Taylor Gibb is a Microsoft MVP and all round geek, he loves everything from Windows 8 to Windows Server 2012 and even C# and PowerShell. You can also follow him on Google+
- Published 04/10/13