19. Automatic Variables¶

Note

The below information is extensively based in information taken from the PowerShell® Notes for Professionals book. I plan to extend this information based on my day to day usage of the language.

Variable called Output Field Separator contains string value that is used when converting an array to a string. By default $OFS = " " ( a space ), but it can be changed:  1 2 3 4 5 6 $array = 1 , 2 , 3 "$array" # default OFS will be used 1 2 3$OFS = ",." # we change OFS to comma and dot "$array" 1 ,.2,.3  19.2:$?¶

Contains status of the last operation. When there is no error, it is set to True:

 1 2 3 4 Write-Host "Hello" Hello $? True  If there is some error, it is set to False:   1 2 3 4 5 6 7 8 9 10 wrt-host wrt-host : The term 'wrt-host' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line: 1 char: 1 + wrt-host + ~~~~~~~~ + CategoryInfo : ObjectNotFound: (wrt-host:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException   1 2 $? False 

19.3: $null¶$null is used to represent absent or undefined value.

$null can be used as an empty placeholder for empty value in arrays:  1 2 3 $array = 1 , "string", $null$array.Count 3 

When we use the same array as the source for ForEach-Object , it will process all three items (including $null):  1 2 3 4 $array | ForEach-Object {"Hello"} Hello Hello Hello 

Be careful! This means that ForEach-Object WILL process even $null all by itself:  1 2 $null | ForEach-Object {"Hello"} # THIS WILL DO ONE ITERATION !!! Hello 

Which is very unexpected result if you compare it to classic foreach loop:

 1 2 foreach($i in$null) {"Hello"} # THIS WILL DO NO ITERATION C:\> 

19.4: $error¶ Array of most recent error objects. The first one in the array is the most recent one:  1 2 3 4 5 6 7 throw "Error" # resulting output will be in red font Error At line: 1 char: 1 + throw "Error" + ~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (Error:String) [], RuntimeException + FullyQualifiedErrorId : Error   1 2 3 4 5 6 7 $error[ 0 ] # resulting output will be normal string (not red ) Error At line: 1 char: 1 + throw "Error" + ~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (Error:String) [], RuntimeException + FullyQualifiedErrorId : Error 

Usage hints: When using the $error variable in a format cmdlet (e.g. format-list), be aware to use the -Force switch. Otherwise the format cmdlet is going to output the$errorcontents in above shown manner.

Error entries can be removed via e.g. $Error.Remove($Error[ 0 ]).

19.6: Boolean values¶

$true and$false are two variables that represent logical TRUE and FALSE.

Note that you have to specify the dollar sign as the first character (which is different from C#).

 1 2 3 4 $boolExpr = "abc".Length -eq 3 # length of "abc" is 3, hence$boolExpr will be True if($boolExpr -eq$true){ "Length is 3" } 
 1 2 3 # result will be "Length is 3" $boolExpr -ne$true #result will be False 

Notice that when you use boolean true/false in your code you write $true or$false, but when Powershell returns a boolean, it looks like True or False

19.7: $_ /$PSItem¶

Contains the object/item currently being processed by the pipeline.

 1 2 3 4 5 6 1 .. 5 | % { Write-Host "The current item is $_" } The current item is 1 The current item is 2 The current item is 3 The current item is 4 The current item is 5 $PSItem and $_ are identical and can be used interchangeably, but$_ is by far the most commonly used.

19.8: $PSVersionTable¶ Contains a read-only hash table (Constant, AllScope) that displays details about the version of PowerShell that is running in the current session.   1 2 3 4 5 6 7 8 9 10 $PSVersionTable #this call results in this: Name Value ---- ----- PSVersion 5.0.10586.117 PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.10586.117 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 

The fastest way to get a version of PowerShell running:

 1 2 3 4 5 \$PSVersionTable.PSVersion # result : Major Minor Build Revision ----- ----- ----- -------- 5 0 10586 117