This post is the help rewrite for about_Aliases. While the help files for Windows PowerShell are invaluable, the idea behind a rewrite is so true beginners might even better understand the help file concepts. At times, some things discussed in the Windows PowerShell help file will not be included in a help rewrite. Therefore, it is always best to read the actual help file after reading this post. (PS3.0)
A variable in Windows PowerShell is a storage container in memory that can hold a value or values. Variables can store numbers, letters, strings (a sequence of numbers, letters, and/or other characters), and the results of a command that has been run in Windows PowerShell. Variables are defined by a dollar sign ($
) and a string of text that follows.
PS C:\> $myVariable
PS C:\> $Process
PS C:\> $UserName
PS C:\> $a
PS C:\> $Var
Windows PowerShell has three types of variables. There are user-created variables, automatic variables, and preference variables. User-created variables are created by a user such as the variables in this example.
PS C:\> $Name = 'Macy Jones'
PS C:\> $Number = 10
Automatic variables store the state of Windows PowerShell, such as the $PSHOME
variable, which stores the install location of Windows PowerShell. This type of variable cannot be changed by a user. This example shows what happens when a user tries to change the value of the $PSHOME
automatic variable.
PS C:\> $PSHOME
C:\Windows\System32\WindowsPowerShell\v1.0
PS C:\> $PSHOME = 'C:\Windows'
Cannot overwrite variable PSHOME because it is read-only or constant.
At line:1 char:1
+ $PSHOME = ‘C:\Windows’
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (PSHOME:String) [], SessionStateUnauthorizedAccessException
+ FullyQualifiedErrorId : VariableNotWritable
Preference variables store a default value but can be changed. These types of variables include the $MaximumAliasCount variable that stores the maximum number of aliases Windows PowerShell will store (the default value for this variable is 4096). This example shows how this variable’s value can be changed.
PS C:\> $MaximumAliasCount
4096
PS C:\> $MaximumAliasCount = 2000
PS C:\> $MaximumAliasCount
2000
PS C:\> $MaximumAliasCount = 4096
Variables are created by combining a dollar sign ($
) and a text string. It is beneficial to name variables in such a way that the name helps define what the variable will store. Then use the = operator to assign, or set, the variable with a value. This example shows two variables, $Name
and $Number
, being set to two different values. To display the value assigned to a variable, type a dollar sign and the variable name and press Enter.
PS C:\> $Name = 'Macy Jones'
PS C:\> $Number = 10
PS C:\> $Series = 1,2,3
PS C:\> $Name
Macy Jones
PS C:\> $Number
10
PS C:\> $Series
1
2
3
The variable’s values can also be displayed using the Write-Output
cmdlet, as well as the aliases for Write-Output
, write
and echo
. This is used more often in scripts as opposed to the Windows PowerShell console.
PS C:\> Write-Output $Name
Macy Jones
PS C:\> write $Name
Macy Jones
PS C:\> echo $Name
Macy Jones
While the Write-Host
cmdlet can also display a variable’s value, in most cases, it should not be used in place of Write-Output
.
PS C:\> Write-Host $Name
Macy Jones
Variable names are not case-sensitive. The case of a variable name does not matter when it is assigned or used. This example also indicates how to assign a new value to a variable that already had a value.
PS C:\> $name
Macy Jones
PS C:\> $NAME
Macy Jones
PS C:\> $NamE
Macy Jones
PS C:\> $NAME = 'Lance Andrews'
PS C:\> $name
Lance Andrews
PS C:\> $name = 'Macy Jones'
PS C:\> $NAMe
Macy Jones
Variables can hold the results of commands. The first part of this example uses the Get-Process
cmdlet to immediately display the first four running processes. In the second part of the example, the first four running processes are stored in a variable and then displayed when the variable is entered.
PS C:\> Get-Process | Select-Object -First 4
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
224 19 3436 772 110 16.80 4612 ALMon
164 14 2476 2100 44 5.53 2744 ALsvc
77 9 1336 5288 75 140.70 4076 ApMsgFwd
90 8 1372 5852 76 162.11 4324 ApntEx
PS C:\> $Processes = Get-Process | Select-Object -First 4
PS C:\> $Processes
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
224 19 3436 772 110 16.80 4612 ALMon
164 14 2476 2100 44 5.53 2744 ALsvc
77 9 1336 5288 75 140.73 4076 ApMsgFwd
90 8 1372 5852 76 162.11 4324 ApntEx
This examples sets, or assigns, the $Date
variable to the results of the Get-Date
cmdlet.
PS C:\> $Date = Get-Date
PS C:\> $Date
Thursday, May 01, 2014 9:20:30 PM
The Clear-Variable
cmdlet, or clv
alias, in this example, will remove the value that has been assigned to a variable without destroying, or removing, the variable itself. When referencing the variable, the dollar sign ($
) is not used with either of these two cmdlets or with the Get-Variable
cmdlet. The Get-Variable
cmdlet will list all the variables in the session or list a single variable when a variable name is supplied.
PS C:\> $Name
Macy Jones
PS C:\> Clear-Variable Name
PS C:\> $Name
PS C:\> Get-Variable Name
Name Value
---- -----
Name
The Remove-Variable
cmdlet, or rv
alias, in this example, will completely remove a variable and its stored value from memory.
PS C:\> $Color = 'Green'
PS C:\> $Color
Green
PS C:\> Remove-Variable Color
PS C:\> $Color
PS C:\>
PS C:\> Get-Variable Color
Get-Variable : Cannot find a variable with the name ‘Color’.
At line:1 char:1
+ Get-Variable Color
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Color:String) [Get-Variable], ItemNotFoundException
+ FullyQualifiedErrorId : VariableNotFound,Microsoft.PowerShell.Commands.GetVariableCommand
Variables can store different types of data. Normally they make their type determination based on the value(s) assigned to them. They can store integers, strings, arrays, and more. A single variable, when it is an array, can contain different types of data at the same time. The examples below use the Get-Member
cmdlet to return properties (and more) about our variable. The Select-Object
cmdlet has also been used to help filter what is returned.
PS C:\> $a = 12
PS C:\> $a | Get-Member | Select-Object TypeName -Unique
TypeName
--------
System.Int32
PS C:\> $a = 'Word'
PS C:\> $a | Get-Member | Select-Object TypeName -Unique
TypeName
--------
System.String
PS C:\> $a = 12,'Word'
PS C:\> $a | Get-Member | Select-Object TypeName -Unique
TypeName
--------
System.Int32
System.String
A variable can be forced to be a certain type by casting the variable. In the first part of the example below, the variable $Number
will be cast with an int
type (int
, as in, integer). Even though the variable is cast as an integer, it is able to handle being assign a string value of “12345.” This is because the variable can change that string into a numeric value. It cannot do the same thing with the string “Hello.”
Further down in the example, the $Words
variable has been cast as a string. When it is set to a numeric value it converts the numeric value into a string value. If the variable is used in a mathematical equation, such as an addition equation, it does not add the two values and instead will concatenate, or join them.
PS C:\> [int]$Number = 10
PS C:\> $Number
10
PS C:\> $Number = '12345'
PS C:\> $Number
12345
PS C:\> $Number = 'Hello'
Cannot convert value “Hello” to type “System.Int32”. Error: “Input string was not in a correct format.”
At line:1 char:1
+ $Number = ‘Hello’
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
PS C:\> [string]$Words = 'Hello'
PS C:\> $Words
Hello
PS C:\> $Words = 2
PS C:\> $Words
2
PS C:\> $Words + 10
210
PS C:\> $Number
12345
PS C:\> $Number + 10
12355
There are differences between using single quotes–which should be used as often as possible–and double-quotes. Single quotes around a variable will not expand the value stored in the variable; however, using double quotes will expand the variable.
PS C:\> $Name = 'Macy Jones'
PS C:\> 'Her name is $Name'
Her name is $Name
PS C:\> "Her name is $Name"
Her name is Macy Jones
Although variable names can include spaces and special characters, it should be avoided as it can quickly lead to confusion. Using spaces and special characters requires the variable name be enclosed in curly brackets {}
.
PS C:\> ${!@#$} = 'Monday'
PS C:\> ${Favorite Day} = 'Friday'
PS C:\> ${!@#$}
Monday
PS C:\> ${Favorite Day}
Friday
Windows PowerShell creates a variable drive that looks and acts a lot like a file system drive. You can access data in the variable drive the same way things are accessed in a file system. The first example uses Get-ChildItem
to get the first 4 folders in C:\Windows
. The second example does the same thing but instead returns the first four variables in the variable drive.
PS C:\> Get-ChildItem C:\Windows | select -First 4
Directory: C:\Windows
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 11/5/2013 3:31 PM ADAM
d---- 7/13/2009 10:32 PM addins
d---- 7/13/2009 8:20 PM AppCompat
d---- 4/11/2014 5:22 PM AppPatch
PS C:\> Get-ChildItem variable:\ | select -First 4
Name Value
---- -----
!@#$ Monday
$ 4
? True
^ Get-ChildItem
The only other variable cmdlet that was not discussed is the New-Variable
cmdlet. This cmdlet is often not used since a variable can be created without it. The first example below shows how to return all the variable-related cmdlets. The second example shows how to use New-Variable
.
PS C:\> Get-Command *-Variable
CommandType Name ModuleName
----------- ---- ----------
Cmdlet Clear-Variable Microsoft.PowerShell.Utility
Cmdlet Get-Variable Microsoft.PowerShell.Utility
Cmdlet New-Variable Microsoft.PowerShell.Utility
Cmdlet Remove-Variable Microsoft.PowerShell.Utility
Cmdlet Set-Variable Microsoft.PowerShell.Utility
PS C:\> New-Variable -Name DaysInYear -Value 365
PS C:\> $DaysInYear
365
Bonus Information
There may come a time when two (or more) variables need to be set to the same value. These do not need to be set individually. This first example shows how to set two variables at the same time and the second example shows how to set three variables at the same time.
PS C:\> $a = $b = 'Windows PowerShell'
PS C:\> $a
Windows PowerShell
PS C:\> $b
Windows PowerShell
PS C:\> $x = $y = $z = 42
PS C:\> $x
42
PS C:\> $y
42
PS C:\> $z
42
Real World
When values of a variable are displayed in the console, it will very rarely follow the Write-Output
cmdlet. This cmdlet is most often used in scripts than it is with commands written in the console.
Learn More
This information, and more, are stored in the help file about_Variables
that comes with Windows PowerShell. This information can be read by typing any of the commands below. The first example will display the help file in the Windows PowerShell console, the second example will open the full help in its own window, and the third example will send the contents of the help file to the clipboard (so it can be pasted into Word, Notepad, etc.), and the fourth example will open the help file in Notepad.
PS C:\> Get-Help about_variables
PS C:\> Get-Help about_variables -ShowWindow
PS C:\> Get-Help about_variables| clip
PS C:\> Notepad $PSHOME\en-us\about_Variables.help.txt