3.2 KiB
PowerShell Scripting Crash Course
After having followed the README.md, .ps1
scripts in the same folder as $PROFILE.CurrentUserAllHosts
will be available in $env:PATH
globally:
# Open the $PROFILE folder
explorer (Split-Path -Parent $PROFILE.CurrentUserAllHosts)
codium (Split-Path -Parent $PROFILE.CurrentUserAllHosts)
# Or start directly editing a script
notepad "$(Split-Path -Parent $PROFILE.CurrentUserAllHosts)\my-script.ps1"
codium "$(Split-Path -Parent $PROFILE.CurrentUserAllHosts)\my-script.ps1"
variables
PowerShell is as case-insensitive as possible. This means $MyInvocation
works just the same as $mYinoCAtiOn
among other things. Coming from a Unix background and preferring some consistency I like to pretend it is case-sensitive so in this repo I'll strive for that but it's worth keeping in mind. Especially since the Microsoft docs use case a lot in variable and cmdlet names.
Variables use $
to distinguish themselves and can be set with =
$a_variable = "this one is a string"
$interpolate_a_string = "like this: $a_variable"
booleans
There are a few constants to know: $true
, $false
, $null
. Empty strings (""
, ''
), $null
and 0
evaluate as $false
if and while
There are a handful of comparison operators which can be used with if
or while
like this:
if ($val -eq "y") {
Write-Host "value is a y"
}
else {
Write-Host "value is not a y"
}
while ($num -lt 50) {
$num = $num + 1
}
param
At the beginning of scripts and functions param
list can be specified like this
param(
[string]$name = "Anonymous",
[int]$age,
[switch]$silent
)
There are a lot of different powers behind the square bracket syntax, including custom validation, but these are the basics. Parameters are not mandatory by default use [Parameter(Mandatory)]
for that. The above param block could be used in a script like this:
if ($silent) { exit }
Write-Host "Hello $name"
if ($age) {
Write-Host "according to the -age you provided you are: $age"
}
And run like this:
name_and_age.ps1 -name "Rose" -age "27"
functions
Functions use param
too (instead of parenthesis like other languages). The last value is the return
result, (which you can also use to return
early... or just regularly if you want)
function My-Add {
param(
[Parameter(Mandatory)][int]$x,
[Parameter(Mandatory)][int]$y,
)
$x + $y
}