PowerShell Basics
PowerShell isnβt just the interactive powershell.exe
and powershell_ise.exe
binaries, Powershell itself is actually System.Management.Automation.dll
which is a dependency of various hosts.
The following is a table that represents the different versions of Powershell supported over time
Version | Release Date | OS Support |
---|---|---|
PowerShell V1 | 2006 | Windows Server 2008 |
PowerShell V2 | 2009 | Windows 7, Windows Server 2008 R2 |
PowerShell V3 / WMF3 | 2013 | Windows 8, Windows Server 2012 |
PowerShell V4 | 2013 | Windows 8.1 |
PowerShell V5 | 2015 | Windows 10, Windows Server 2016 |
PowerShell Core | 2016 | Nano Server, Windows 10 IoT |
PowerShell V6 (Core) | 2017 | Windows, macOS, *UNIX |
To determine what PowerShell versions we have installed on a system we use
Execution policy is NOT a security protection as it can be disabled with something as simple as
or
PowerShell files can come in different formats:
.ps1
: a single PowerShell script, completely self-contained and can be loaded into memory in one go.psm1
: a PowerShell module file, this allows to do things like exporting only specific functions / variables and it's often used to give a better structure to more complex PowerShell code.psd1
: a PowerShell module manifest that specifies information about the module itself and what variables / functions are exported.ps1xml
: a object formatting file for a PowerShell module that allows for granular control of how custom objects are displayed
PowerShell Profile Locations
Profile | Location |
---|---|
AllUsersAllHosts |
|
AllUsersAllHosts (WoW64) |
|
AllUsersCurrentHost |
|
AllUsersCurrentHost (ISE) |
|
AllUsersCurrentHost (WoW64) |
|
AllUsersCurrentHost (ISE - Wow64) |
|
CurrentUserAllHosts |
|
CurrentUserCurrentHost |
|
CurrentUserCurrentHost (ISE) |
|
Exporting/Importing PowerShell Objects
To import / export PowerShell objects we use the Import-Clixml
and Export-Clixml
functions
Variables & Operators
Variables are defined with $
followed by any combination of numbers and (case-insensitive) letters but we can also use New-Variable
to specify non-printable characters as well.
To list all variables in the current scope we can use Get-ChildItem Variable:\
and to cast a variable to another data type we use [Type]$variableName
.
The following are common operators used with variables and their attributes
Math:
+
,-
,*
,/
,%
Assignment:
=
,+=
,-=
,*=
,/=
,%=
Comparison:
-eq
,-ne
,-gt
,-lt
,-le
,-ge
, regex operationsLogical:
-and
,-or
,-xor
,-not
or!
Redirection:
>
,>>
,2>
,2>>
,2>&1
Type:
-is
,-isnot
,-as
It's possible to get more information about operators with Get-Help about_Operators
.
Arrays & Hash Tables
There are many ways to create arrays
Creation method | Code |
---|---|
Implicit creation |
|
Explicit creation |
|
Ranged creation |
|
Strongly typed |
|
and there are several operations we can perform on an array object
count the number of elements:
$array.Count
indexing:
$array[0]
reversing an array:
$array[-1..-$array.Lenght]
append a value to an array:
$array += $value
Since arrays are immutable we have to perform extra steps to append or remove elements from one
HashTables in PowerShell are the equivalent of dictionaries
Common operations we can perform on hash tables are
return the keys of the hash table:
$hashtable.keys
return the values of the hash table:
$hashtable.values
add a key or value
remove a key:
$hashtable.Remove("Key")
Hash tables can also be used as parameters for function calls
Strings
Double-quoted strings - both single and multi-line - expand sub-expressions and variables while single-quoted strings don't.
Case-insensitive comparison (returns 0 if strings are the same):
$a.CompareTo($b)
Case-sensitive comparison:
[string]::Compare($a, $b, $True)
Case-sensitive prefix / suffix:
$a.StartsWith("prefix")
,$a.EndsWith("suffix")
Turn string lowercase / uppercase:
$a.ToLower()
,$a.ToUpper()
Check for substring (case-sensitive):
$a.Contains("substring")
Replace a string or substring:
$a.Replace("old string", "new string")
Substring:
$a.SubString(index)
returnsa[index..$a.Length-1]
or$a.SubString(start, end)
returns$a[start..end]
Split a string:
$a.Split("separator")
returns an array of the string split by the separatorPad a string:
$a.PadLeft(1)
,$a.PadRight(1)
pads the string to the specified lengthConvert string to a byte array:
$a.ToByteArray()
Regular Expressions
Strings can also be used to match regular expressions with operators like -match
, -notmatch
(case-insensitive) or -cmatch
, -cnotmatch
(case-sensitive).
The -match
operator will populate the $Matches
variable with all the matches if used on a single-line variable.
To match and replace part of a string we use -replace
and -creplace
Logic & Loops
If / else / if-else statements
Switch statements
Try / catch / finally statements
For-each statements
For-each-object statement
While / do-while statement
Filtering
When piping output from other commands it's possible to filter it
Find an object with specific properties:
Execute a scriptblock on each object:
Find property comparisons
We can also sort objects by a set property with Sort-Object property
, group objects with GroupObject property
or select only some objects with
Last updated