Last active
October 2, 2024 19:54
-
-
Save pcgeek86/336e08d1a09e3dd1a8f0a30a9fe61c8a to your computer and use it in GitHub Desktop.
PowerShell Cheat Sheet / Quick Reference
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 the PowerShell 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 | |
################################################### | |
# 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 the -like operator, which supports the wildcard (*) character. Returns $true | |
$BaconIsYummy = $true | |
$FoodToEat = $BaconIsYummy ? 'bacon' : 'beets' # Sets the $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] # Is the number 5 a string value? No. Returns $false. | |
5 -is [int32] # Is the number 5 a 32-bit integer? Yes. Returns $true. | |
5 -is [int64] # Is 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. | |
################################################### | |
# 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 | |
@('Trevor', '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('Trevor Bobby Dillon Joe Jacob').Value # Find multiple matches against a singleton string value. | |
################################################### | |
# 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 } | |
} | |
################################################### | |
# Variables | |
################################################### | |
$a = 0 # Initialize a variable | |
[int] $a = 'Trevor' # Initialize a variable, with the specified type (throws an exception) | |
[string] $a = 'Trevor' # Initialize a variable, with the specified type (doesn't throw an exception) | |
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 the -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 | |
################################################### | |
# Functions | |
################################################### | |
function add ($a, $b) { $a + $b } # A basic PowerShell function | |
function Do-Something { # A PowerShell Advanced Function, with all three blocks declared: BEGIN, PROCESS, END | |
[CmdletBinding]()] | |
param () | |
begin { } | |
process { } | |
end { } | |
} | |
################################################### | |
# 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 the modules installed on my system (controlled by $env:PSModulePath) | |
Get-Module # Show me all of the modules imported into the 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 the specified filesystem path or name (must be present in $env:PSModulePath) | |
Remove-Module -Name NameIT # Remove a module from the scope of the 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 PowerShell module (advanced users) | |
function Add($a,$b) { $a + $b } } | |
New-Module -Name trevor -ScriptBlock { # Create an in-memory PowerShell 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) | |
################################################### | |
$Person = @{ | |
FirstName = 'Trevor' | |
LastName = 'Sullivan' | |
Likes = @( | |
'Bacon', | |
'Beer', | |
'Software' | |
) | |
} # Create a PowerShell HashTable | |
$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 information about locally connected physical disk devices | |
Get-CimInstance -ClassName Win32_PhysicalMemory # Retrieve information about install physical memory (RAM) | |
Get-CimInstance -ClassName Win32_NetworkAdapter # Retrieve information about installed network adapters (physical + virtual) | |
Get-CimInstance -ClassName Win32_VideoController # Retrieve information about installed graphics / video card (GPU) | |
Get-CimClass -Namespace root\cimv2 # Explore the various WMI classes available in the root\cimv2 namespace | |
Get-CimInstance -Namespace root -ClassName __NAMESPACE # Explore the child WMI namespaces underneath the 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 = 'Sullivan' # 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 = 'Trevor' # 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 the path to the private key used to authenticate to the server | |
[string] $Username # Set the 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 the Server class as a new object | |
$Server01.Name = 'webserver01.local' # Set the "name" of the remote server | |
$Server01.Username = 'root' # Set the username property of the "Server" object | |
$Server01.RunCommand("hostname") # Run a 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 | |
thanx for the nice cheat sheet - its really helpful
Thankyou! appreciate it!
great cheat sheet
Thanks, very usefull
Excellent cheat sheet, for your information, there is a typo on this line https://gist.github.com/pcgeek86/336e08d1a09e3dd1a8f0a30a9fe61c8a#file-cheatsheet-ps1-L109
[CmdletBinding]()]
-> [CmdletBinding()]
I've been using PowerShell heavily for work since the 2.0 days and I still learned some stuff from this. Thanks, my man.
Just wondering if this could be appened / merged into https://learnxinyminutes.com/docs/powershell
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
thanks for the nice cheatsheet - like it