Powershell

From Leo's Notes
Last edited on 30 December 2021, at 01:45.

Quick Overview[edit | edit source]

Syntax[edit | edit source]

Comments[edit | edit source]

# Single Line Comments

<#
multi-line comments
#>

Multi-Line Commands[edit | edit source]

Similar to the \ in bash, use the backtick to continue the command on the next line.

Do-Something `
  -param1 value `
  -param2 value

Boolean Values[edit | edit source]

Use $TRUE or $FALSE.

Strings[edit | edit source]

Strings can be:

  • Concatenated using +
  • Split using .Split("delimiter") (ie. PHP's explode())
  • Joined (list of strings) using [string]::join("delimiter", $array) (ie. PHP's implode())
  • Search/Replaced using -replace. Search patterns can be regex.
"hello.cs.cpsc.ucalgary.ca" -replace "cs.cpsc","cpsc"
# Returns 'hello.cpsc.ucalgary.ca'
  • Searched using -match. Search patterns can be regex.
"hello.cs.cpsc.ucalgary.ca" -match "^hello.*ca$"
# Returns True

Data Containers[edit | edit source]

These are things in powershell that can contain data values or other objects.

Objects[edit | edit source]
$a = New-Object TypeNamePSObject
$a

Arrays (aka. Lists)

$a = @()
$a += "Item"
$a.Count    # 1
$a.Remove("Item")   # Can also remove by index range and number of items: $a.RemoveRange(0,1)
$a.Clear()

# Other things you may want to know:
[array]::Reverse($a)   # reverses array in place.

Hash Tables (aka. a Dictionary)

# Basic Operation
$a = @{}   # or with initialized values:  $a = @{"Key1" = "Value1" ; "Key2" = "Value2"}
$a.Add("Key", "Value")
$a["Key"] = "New Value"
$a.Remove("Key")

# To iterate over the hash table
$a.GetEnumerator()

Parameters[edit | edit source]

For functions, parameters can be given as part of the function definition. Eg:

function Get-HostsFromServer([string]$IpAddress) {
   # ...
}

Alternatively:

function Get-HostsFromServer {
   param( [string]$IpAddress )
   # ...
}

You can have strict parameter checking with Advanced Functions (ie. script cmdlets which contain the 3 methods begin, process, end).

Common Tasks[edit | edit source]

Writing Output[edit | edit source]

Use Write-Host to write logging information to the console. It runs [console]::WriteLine() in the background.

Use Write-Output to write to the pipeline.

In either case, wrap the output text in brackets so that concatenation works as expected. Eg: Write-Output ("Hello" + $World).

Filtering[edit | edit source]

Pipe to Where-Object and provide the matching condition.

Where-Object {$_.RecordData.IPv4Address -like "172.20.1.*" }

Limiting[edit | edit source]

Pipe to Select with the desired option. This is similar to head and tail in UNIX shells.

# First (Analogous to `head -n 1`)
Select -last 1

# Last  (Analogous to `tail -n 1`)
Select -last 1

Iterating[edit | edit source]

Use the ForEach statement:

foreach($item in $items) {
  # do things on $item
}

Or if you're dealing with a list of objects, pipe to the ForEach-Object. Pass in any of:

  • -process - Runs for each incoming object
  • -begin - Runs before any object is processed
  • -end - Runs after objects are processed

Eg:

ForEach-Object -process { $_.doSomething() }

Other Stuff[edit | edit source]

Get machine UUID[edit | edit source]

To get the UUID of the computer (analogous to dmidecode|grep -i uuid), run:

get-wmiobject Win32_ComputerSystemProduct

Troubleshooting[edit | edit source]

Error: "File cannot be loaded because the execution of scripts is disabled on this system"

To allow untrusted script execution, open a powershell instance (same arch as what you're trying to run the script as. ie: 64bit/32bit) as Administrator and run:

PS> set-executionpolicy unrestricted

You should now be able to see:

PS> get-executionpolicy
 Unrestricted