Versions
You really should be using the cross-platform PowerShell Core. You can get installers for Windows, Linux and MacOS.
PowerShell Core is implemented in pwsh.exe whereas the old, Windows specific, PowerShell was powershell.exe. The two versions can coexist on the same machine.
What Version of PowerShell is installed?
PS H:\> Get-Host
Name : ConsoleHost
Version : 7.2.4
InstanceId : 052ac3b9-57bb-48b5-bc46-8dbc2636c883
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : en-US
CurrentUICulture : en-US
PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled : True
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspace
PS H:\>
Variables
$foo = 1
$foo = 3.142
$foo = 'bar'
$foo = "bar"
$foo = '2022-06-15 23:10:11'
Types and Casting
PS H:\> $foo = 1
PS H:\> $foo.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
PS H:\> $foo = 3.142
PS H:\> $foo.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Double System.ValueType
PS H:\> $foo = 'bar'
PS H:\> $foo.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS H:\> $foo = "bar"
PS H:\> $foo.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS H:\> $foo = [int]3.142
PS H:\> $foo
3
PS H:\> $foo = [double]42
PS H:\> $foo.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Double System.ValueType
PS H:\> $foo = [DateTime]'2022-06-15 12:23:34'
PS H:\> $foo.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DateTime System.ValueType
PS H:\> $foo
Wednesday, June 15, 2022 12:23:34 PM
PS H:\>
Strings and Interpolation
Double quoted strings interpolate variables. Single quoted strings do not.
$foo = "bar"
$bar = "I said $foo"
$baz = 'I said $foo'
To interpolate an expression surround the expression in $( )
.
$bar = "I said $($foo.ToUpper())"
Concatenate strings with +
$bar = "Part 1" + $foo + " part 2"
Arrays
Create literal lists …
PS H:\> $array = 1, 2, 3
PS H:\> $array.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS H:\>
Alternatives …
$array = (1, 2, 3)
$array = @(1, 2, 3)
Add onto the end of an array. This actually creates a new array and copies the old array over …
PS H:\> $array = 1, 2, 3
PS H:\> $array + 4
1
2
3
4
PS H:\> $array.Length
4
Dynamic Arrays
Use .Net collections …
PS H:\> $list = New-Object System.Collections.Generic.List[string]
PS H:\> $list.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True List`1 System.Object
PS H:\> $list.Add('foo')
PS H:\> $list.Add('bar')
PS H:\> $list
foo
bar
PS H:\> $list.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True List`1 System.Object
PS H:\> $list[0]
foo
PS H:\> $list[0].GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS H:\> $list.Count
3
PS H:\>
Hash Tables
PS H:\> $hash = @{ foo = 'bar'; bar = 'baz' }
PS H:\> $hash
Name Value
---- -----
bar baz
foo bar
PS H:\> $hash.Add('baz', 'bing')
PS H:\> $hash
Name Value
---- -----
bar baz
foo bar
baz bing
PS H:\> $hash.Remove('baz')
PS H:\> $hash
Name Value
---- -----
bar baz
foo bar
PS H:\> $hash.bar
baz
PS H:\> $hash['bar']
baz
PS H:\>
PS H:\> $hash = @{ 'foo' = 'bar'; 'bar' = 'baz' }
PS H:\> $hash
Name Value
---- -----
bar baz
foo bar
PS H:\>
Nested Structures
PS H:\> $hash = @{
>> foo = @(
>> 1,2,3
>> ); bar = @(42)
>> }
Name Value
---- -----
bar {42}
foo {1, 2, 3}
PS H:\> $hash.foo
1
2
3
PS H:\>
Splitting Strings
The -split
operator allows you to use a regex …
PS H:\> $s = 'foo, bar , baz'
PS H:\> $s -split '\s*,\s*'
foo
bar
baz
PS H:\>
Joining Arrays
PS H:\> (1, 2, 3) -join ','
1,2,3
PS H:\>
Regex Replace
PS H:\> $s = ' foo bar baz '
PS H:\> $s -replace '^\s+(.+)\s+', '$1'
foo bar baz
PS H:\>
Regex Match
PS H:\> $s = ' foo bar '
PS H:\> $s -match '\s+ba'
True
PS H:\>
Looping
foreach($element in $array) {
Write-Host $element
}
for($n = 0; $n -lt 10; ++$n) {
Write-Host $n
}
$n = 0
while($true) {
Write-Host $n
if($n -gt 4) { break }
++$n
}
$n = 0
do {
Write-Host $n
++$n
} while($n -lt 4)
$n = 0
do {
Write-Host $n
++$n
} until($n -gt 4)