Skip to content

Latest commit

 

History

History
310 lines (259 loc) · 13.4 KB

File metadata and controls

310 lines (259 loc) · 13.4 KB

PowerShell Cheat Sheet

====================================

Basic Commands

	Cmdlet : Commands built into shell written in .NET
	Functions : Commands written in PowerShell language
	Parameter : Argument to a Cmdlet/Function/Script
	Alias : Shortcut for a Cmdlet or Function
	Scripts : Text files with .ps1 extension
	Applications : Existing windows programs
	Pipelines : Pass objects Get-process word | Stop-Process
	Ctrl+c : Interrupt current command
	Left/right : Navigate editing cursor
	Ctrl+left/right : Navigate a word at a time
	Home / End : End Move to start / end of line
	Up / down : Move up and down through history
	Insert : Toggles between insert/overwrite mode
	F7 : Command history in a window
	Tab / Shift-Tab : Command line completion

Commands to get Help

Get-Command			# Retrieves a list of all the commands available to PowerShell
					# (native binaries in $env:PATH + cmdlets / functions from PowerShell modules)
Get-Command -Module Microsoft*			# Retrieves a list of all Pwsh commands exported from modules named Microsoft*
Get-Command -Name *item				# Retrieves a list of all commands (native binaries + PowerShell commands) ending in "item"

Get-Help								# Get all help topics
Get-Help -Name about_Variables			# Get help for a specific about_* topic (aka. man page)
Get-Help -Name Get-Command			# Get help for a specific PowerShell function
Get-Help -Name Get-Command -Parameter Module		# Get help for a specific parameter on a specific command

Variables

$a = 0					# Initialize a variable
[int]$a = 'Paris`			# Initialize a variable, with the specified type (throws an exception)
[string]$a = 'Paris`			# Initialize a variable, with the specified type (doesn't throw an exception)
$a,$b = 0 or $a,$b = 'a','b`		# Assign multiple variables
$a,$b = $b,$a				# Flip variables
$var=[int]5				# Strongly typed variable

Get-Command -Name *varia*		# Get a list of commands related to variable management

Get-Variable				# Get an array of objects, representing the variables in the current and parent scopes 
Get-Variable | ? { $PSItem.Options -contains 'constant' }	# Get variables with the "Constant" option set
Get-Variable | ? { $PSItem.Options -contains 'readonly' }	# Get variables with the "ReadOnly" option set

New-Variable -Name FirstName -Value Trevor
New-Variable FirstName -Value Trevor -Option Constant		# Create a constant variable, that can only be removed by restarting PowerShell
New-Variable FirstName -Value Trevor -Option ReadOnly		# Create a variable that can only be removed by specifying -Force parameter on Remove-Variable

Remove-Variable -Name firstname			# Remove a variable, with the specified name
Remove-Variable -Name firstname -Force		# Remove a variable, with the specified name, that has the "ReadOnly" option set

Operators

$a = 2			# Basic variable assignment operator
$a += 1			# Incremental assignment operator
$a -= 1			# Decrement assignment operator

$a -eq 0			# Equality comparison operator
$a -ne 5			# Not-equal comparison operator
$a -gt 2			# Greater than comparison operator
$a -lt 3			# Less than comparison operator

$FirstName = 'Trevor'
$FirstName -like 'T*' 	# Perform string comparison using -like operator, which supports wildcard (*) character. Returns $true

$BaconIsYummy = $true
$FoodToEat = $BaconIsYummy ? 'bacon' : 'beets'	# Sets $FoodToEat variable to 'bacon' using the ternary operator

'Celery' -in @('Bacon', 'Sausage', 'Steak', 'Chicken')	# Returns boolean value indicating if left-hand operand exists in right-hand array
'Celery' -notin @('Bacon', 'Sausage', 'Steak')		# Returns $true, because Celery is not part of the right-hand list

5 -is [string]			# The number 5 a string value? No. Returns $false.
5 -is [int32]			# The number 5 a 32-bit integer? Yes. Returns $true.
5 -is [int64]			# The number 5 a 64-bit integer? No. Returns $false.
'Trevor' -is [int64]		# Is 'Trevor' a 64-bit integer? No. Returns $false.
'Trevor' -isnot [string]	# Is 'Trevor' NOT a string? No. Returns $false.
'Trevor' -is [string]		# Is 'Trevor' a string? Yes. Returns $true.
$true -is [bool]			# Is $true a boolean value? Yes. Returns $true.
$false -is [bool]		# Is $false a boolean value? Yes. Returns $true.
5 -is [bool]			# Is the number 5 a boolean value? No. Returns $false.

Flow Control

if (1 -eq 1) { }					# Do something if 1 is equal to 1
do { 'hi' } while ($false)			# Loop while a condition is true (always executes at least once)

while ($false) { 'hi' }				# While loops are not guaranteed to run at least once
while ($true) { }				# Do something indefinitely
while ($true) { if (1 -eq 1) { break } }	# Break out of an infinite while loop conditionally

for ($i = 0; $i -le 10; $i++) { Write-Host $i }		# Iterate using a for..loop
foreach ($item in (Get-Process)) { }			# Iterate over items in an array

switch ('test') { 'test' { 'matched'; break } }		# Use the switch statement to perform actions based on conditions. Returns string 'matched'
switch -regex (@('Trevor', 'Daniel', 'Bobby')) {	# Use the switch statement with regular expressions to match inputs
  'o' { $PSItem; break }					# NOTE: $PSItem or $_ refers to the "current" item being matched in the array
}
switch -regex (@('Trevor', 'Daniel', 'Bobby')) {	# Switch statement omitting the break statement. Inputs can be matched multiple times, in this scenario.
  'e' { $PSItem }
  'r' { $PSItem }
}

Functions

function add ($a, $b) { $a + $b }		# A basic Pwsh function

function Do-Something {			# A Pwsh Advanced Function, with all three blocks declared: BEGIN, PROCESS, END
  [CmdletBinding]()]
  param ()
  begin { }
  process { }
  end { }
}

Regular Expressions

'Trevor' -match '^T\w*'		# Perform a regular expression match against a string value. # Returns $true and populates $matches variable
$matches[0]				# Returns 'Trevor', based on the above match

@('Joe', 'Billy', 'Bobby') -match '^B'		# Perform a regular expression match against an array of string values. Returns Billy, Bobby

$regex = [regex]'(\w{3,8})'
$regex.Matches('Bobby Dillon Joe Jacob').Value		# Find multiple matches against a singleton string value.

Working with Modules

Get-Command -Name *module* -Module mic*core		# Which commands can I use to work with modules?

Get-Module -ListAvailable 		# Show me all of modules installed on my system (controlled by $env:PSModulePath)
Get-Module					# Show me all of the modules imported into current session

$PSModuleAutoLoadingPreference = 0		# Disable auto-loading of installed PowerShell modules, when a command is invoked
Import-Module -Name NameIT		# Explicitly import a module, from specified filesystem path or name (must be present in $env:PSModulePath)
Remove-Module -Name NameIT		# Remove a module from the scope of current PowerShell session
New-ModuleManifest		# Helper function to create a new module manifest. You can create it by hand instead.

New-Module -Name trevor -ScriptBlock {			# Create an in-memory Pwsh module (advanced users)
  function Add($a,$b) { $a + $b } }

New-Module -Name trevor -ScriptBlock {			# Create an in-memory Pwsh module, and make it visible to Get-Module (advanced users)
  function Add($a,$b) { $a + $b } } | Import-Module

Module Management

Get-Command -Module PowerShellGet		# Explore commands to manage PowerShell modules

Find-Module -Tag cloud					# Find modules in the PowerShell Gallery with a "cloud" tag
Find-Module -Name ps*					# Find modules in the PowerShell Gallery whose name starts with "PS"

Install-Module -Name NameIT -Scope CurrentUser -Force	# Install a module to your personal directory (non-admin)
Install-Module -Name NameIT -Force					# Install a module to your personal directory (admin / root)
Install-Module -Name NameIT -RequiredVersion 1.9.0		# Install a specific version of a module

Uninstall-Module -Name NameIT						# Uninstall module called "NameIT", only if it was installed via Install-Module
Register-PSRepository -Name <repo> -SourceLocation <uri>	# Configure a private PowerShell module registry
Unregister-PSRepository -Name <repo>					# Deregister a PowerShell Repository

Filesystem

New-Item -Path c:\test -ItemType Directory	# Create a directory
mkdir c:\test2							# Create a directory (short-hand)

New-Item -Path c:\test\myrecipes.txt		# Create an empty file
Set-Content -Path c:\test.txt -Value ''		# Create an empty file
[System.IO.File]::WriteAllText('testing.txt', '')	# Create an empty file using .NET Base Class Library

Remove-Item -Path testing.txt				# Delete a file
[System.IO.File]::Delete('testing.txt')		# Delete a file using .NET Base Class Library

Hashtables (Dictionary)

# Create a PowerShell HashTable
$Person = @{
  FirstName = 'Joe'
  LastName = 'Doe'
  Likes = @(
    'Bacon',
    'Beer'
  )
}

$Person.FirstName		# Retrieve an item from a HashTable
$Person.Likes[-1]		# Returns the last item in the "Likes" array, in the $Person HashTable (software)
$Person.Age = 50		# Add a new property to a HashTable

Windows Management Instrumentation (WMI) (Windows only)

Get-CimInstance -ClassName Win32_BIOS			# Retrieve BIOS information
Get-CimInstance -ClassName Win32_DiskDrive		# Retrieve info about locally connected physical disk devices
Get-CimInstance -ClassName Win32_PhysicalMemory	# Retrieve info about install physical memory (RAM)
Get-CimInstance -ClassName Win32_NetworkAdapter	# Retrieve info about installed network adapters (physical + virtual)
Get-CimInstance -ClassName Win32_VideoController	# Retrieve info about installed graphics / video card (GPU)

Get-CimClass -Namespace root\cimv2				# Explore various WMI classes available in root\cimv2 namespace
Get-CimInstance -Namespace root -ClassName __NAMESPACE	# Explore child WMI namespaces underneath root\cimv2 namespace

Asynchronous Event Registration

# Register for filesystem events
$Watcher = [System.IO.FileSystemWatcher]::new('c:\tmp')
Register-ObjectEvent -InputObject $Watcher -EventName Created -Action {
  Write-Host -Object 'New file created!!!'
}

# Perform a task on a timer (ie. every 5000 milliseconds)
$Timer = [System.Timers.Timer]::new(5000)
Register-ObjectEvent -InputObject $Timer -EventName Elapsed -Action {
  Write-Host -ForegroundColor Blue -Object 'Timer elapsed! Doing some work.'
}
$Timer.Start()

PowerShell Drives (PSDrives)

Get-PSDrive			# List all the PSDrives on the system
New-PSDrive -Name videos -PSProvider Filesystem -Root x:\data\content\videos	# Create a new PSDrive that points to a filesystem location
New-PSDrive -Name h -PSProvider FileSystem -Root '\\storage\h$\data' -Persist	# Create a persistent mount on a drive letter, visible in Windows Explorer
Set-Location -Path videos:			# Switch into PSDrive context
Remove-PSDrive -Name xyz			# Delete a PSDrive

Data Management

Get-Process | Group-Object -Property Name                   # Group objects by property name
Get-Process | Sort-Object -Property Id                      	# Sort objects by a given property name
Get-Process | Where-Object -FilterScript { $PSItem.Name -match '^c' } 	# Filter objects based on a property matching a value
gps | where Name -match '^c'                                		# Abbreviated form of the previous statement

PowerShell Classes

class Person {
  [string] $FirstName				# Define a class property as a string
  [string] $LastName = 'Doe'		# Define a class property with a default value
  [int] $Age					# Define a class property as an integer
  
  Person() {					# Add a default constructor (no input parameters) for a class
  }
  
  Person([string] $FirstName) {		# Define a class constructor with a single string parameter
    $this.FirstName = $FirstName
  }
  
  [string] FullName() {
    return '{0} {1}' -f $this.FirstName, $this.LastName
  }
}
$Person01 = [Person]::new()		# Instantiate a new Person object.
$Person01.FirstName = 'Joe'		# Set the FirstName property on the Person object.
$Person01.FullName()			# Call the FullName() method on the Person object. Returns 'Trevor Sullivan'

class Server {					# Define a "Server" class, to manage remote servers. Customize this based on your needs.
  [string] $Name
  [System.Net.IPAddress] $IPAddress			# Define a class property as an IPaddress object
  [string] $SSHKey = "$HOME/.ssh/id_rsa"		# Set path to the private key used to authenticate to the server
  [string] $Username						# Set username to login to the remote server with
  
  RunCommand([string] $Command) {		# Define a method to call a command on the remote server, via SSH
    ssh -i $this.SSHKey $this.Username@$this.Name $this.Command
  }
}

$Server01 = [Server]::new()				# Instantiate Server class as a new object
$Server01.Name = 'webserver01.local'		# Set "name" of the remote server
$Server01.Username = 'root'				# Set username property of the "Server" object
$Server01.RunCommand("hostname")		# Run command on the remote server

REST APIs

$Params = @{
  Uri = 'https://api.github.com/events'
  Method = 'Get'
}
Invoke-RestMethod @Params		# Call a REST API, using the HTTP GET method