Powershell

Examples

Core Commands

Streams

Startup Time Benchmark

PowerShell Basics Guide

Core Philosophy

PowerShell works with objects, not text. Commands pass structured data between each other, making scripting more reliable and powerful.

Command Structure

Verb-Noun Format

All cmdlets follow a consistent Verb-Noun pattern:

  • Get-Process - retrieve processes
  • Set-Location - change directory
  • Stop-Service - stop a service
  • New-Item - create a file or folder

Common Verbs

  • Get - retrieve data
  • Set - change configuration
  • New - create something
  • Remove - delete something
  • Start/Stop - control services/processes
  • Import/Export - work with data

Getting Help

PowerShell has excellent built-in documentation:

# Get help for any command
Get-Help Get-Process

# Get detailed help with examples
Get-Help Get-Process -Full
Get-Help Get-Process -Examples

# Update help files (run once)
Update-Help

# Find commands
Get-Command *process*
Get-Command -Verb Get
Get-Command -Noun Service

The Pipeline

The pipeline (|) passes entire objects between commands:

# Get processes, filter by CPU usage, select specific properties
Get-Process | Where-Object {$_.CPU -gt 10} | Select-Object Name, CPU, Memory

# Get services that are running
Get-Service | Where-Object {$_.Status -eq "Running"}

# Get files larger than 1MB
Get-ChildItem | Where-Object {$_.Length -gt 1MB}

Variables

Variables start with $:

$name = "John"
$number = 42
$processes = Get-Process

# Access object properties
$processes[0].Name

Working with Objects

Every object has properties and methods:

# Get an object
$proc = Get-Process -Name "chrome" | Select-Object -First 1

# View all properties
$proc | Get-Member

# Access properties
$proc.Name
$proc.CPU
$proc.WorkingSet

# Call methods
$proc.Kill()

Common Commands

File System

# List files (like ls or dir)
Get-ChildItem
Get-ChildItem -Recurse  # recursive
Get-ChildItem *.txt     # filter

# Change directory
Set-Location C:\Users
cd C:\Users  # alias works too

# Create file/folder
New-Item -Path "test.txt" -ItemType File
New-Item -Path "newfolder" -ItemType Directory

# Copy, Move, Remove
Copy-Item source.txt destination.txt
Move-Item old.txt new.txt
Remove-Item file.txt

Processes

# List processes
Get-Process

# Get specific process
Get-Process -Name chrome

# Stop process
Stop-Process -Name notepad
Stop-Process -Id 1234

Services

# List services
Get-Service

# Control services
Start-Service -Name "wuauserv"
Stop-Service -Name "wuauserv"
Restart-Service -Name "wuauserv"

Filtering and Selecting

Where-Object

Filters objects in the pipeline:

# Filter by condition
Get-Process | Where-Object {$_.CPU -gt 100}
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Get-ChildItem | Where-Object {$_.Length -lt 1KB}

# Shorter syntax (PowerShell 3.0+)
Get-Process | Where CPU -gt 100

Select-Object

Chooses which properties to display:

# Select specific properties
Get-Process | Select-Object Name, CPU, Memory

# Select first/last items
Get-Process | Select-Object -First 5
Get-Process | Select-Object -Last 3

Comparison Operators

-eq   # equal
-ne   # not equal
-gt   # greater than
-lt   # less than
-ge   # greater than or equal
-le   # less than or equal
-like # wildcard match
-match # regex match

Aliases

PowerShell includes familiar aliases:

ls    # Get-ChildItem
dir   # Get-ChildItem
cd    # Set-Location
pwd   # Get-Location
cat   # Get-Content
cp    # Copy-Item
mv    # Move-Item
rm    # Remove-Item
man   # Get-Help

# Find aliases
Get-Alias
Get-Alias -Name ls

Output and Export

# Display as table
Get-Process | Format-Table

# Display as list
Get-Process | Format-List

# Export to CSV
Get-Process | Export-Csv processes.csv

# Export to JSON
Get-Process | ConvertTo-Json | Out-File processes.json

# Save to text file
Get-Process | Out-File processes.txt

Basic Scripting

If Statements

$value = 10
if ($value -gt 5) {
    Write-Host "Greater than 5"
} elseif ($value -eq 5) {
    Write-Host "Equal to 5"
} else {
    Write-Host "Less than 5"
}

Loops

# ForEach
$items = 1..5
foreach ($item in $items) {
    Write-Host $item
}

# ForEach-Object (in pipeline)
Get-Process | ForEach-Object {
    Write-Host $_.Name
}

# While
$i = 0
while ($i -lt 5) {
    Write-Host $i
    $i++
}

Practical Examples

Find large files

Get-ChildItem -Recurse | 
    Where-Object {$_.Length -gt 100MB} | 
    Select-Object Name, Length, FullName | 
    Sort-Object Length -Descending

Monitor CPU usage

Get-Process | 
    Sort-Object CPU -Descending | 
    Select-Object -First 10 Name, CPU, WorkingSet

Find stopped services

Get-Service | 
    Where-Object {$_.Status -eq "Stopped"} | 
    Select-Object Name, DisplayName

Check disk space

Get-PSDrive -PSProvider FileSystem | 
    Select-Object Name, Used, Free, 
        @{Name="UsedGB";Expression={[math]::Round($_.Used/1GB,2)}},
        @{Name="FreeGB";Expression={[math]::Round($_.Free/1GB,2)}}

Tips

  1. Tab completion - Press Tab to autocomplete commands and parameters
  2. Use Get-Member - Explore what properties and methods objects have
  3. ISE or VS Code - Use PowerShell ISE or VS Code for script editing
  4. Execution Policy - You may need to run Set-ExecutionPolicy RemoteSigned to run scripts
  5. Case insensitive - PowerShell commands are not case-sensitive
  6. Comments - Use # for single-line comments, <# #> for multi-line

Next Steps

  • Learn about functions and modules
  • Explore PowerShell remoting for managing remote computers
  • Study error handling with try/catch
  • Look into PowerShell profiles for customization
  • Practice with real automation tasks


Children
  1. Basics Fundamentals
  2. Core Commands
  3. Examples
  4. Startup Time Benchmark
  5. Streams