SPEAKER NOTES:
- Walk through each block briefly so people know what's coming
- Mention that blocks get progressively more advanced
- We'll take 5โ10 minute breaks between major blocks
SPEAKER NOTES:
- TODO: Update GitHub repo URL
- Quick environment check, ask the room if everyone is set up
- If not, they can follow along on screen and troubleshoot during break
- Point people to the GitHub repo for all materials
SPEAKER NOTES:
- Section break, take a breath
- This block covers the absolute fundamentals
- By the end, everyone should be able to find and run commands
SPEAKER NOTES:
- "Life without PowerShell" vs "Life with PowerShell", paint the picture
- Emphasize that PowerShell runs everywhere now, not just Windows
- This is the "why should I care" slide
- PowerShell isn't just for sysadmins anymore. Developers, cloud engineers,
security analysts all benefit
SPEAKER NOTES:
- DEMO: Open VS Code, show the terminal, run $PSVersionTable
- Point out the PowerShell extension features: IntelliSense, integrated terminal
- Show that the terminal is a full PowerShell session
- This is where we'll spend most of our time. Make sure everyone has it open
- Transition: "Now let's learn how to find help when we're stuck"
SPEAKER NOTES:
- DEMO: Run Update-Help, then Get-Help Get-Process -Full
- Show parameter sets, mandatory vs optional parameters
- Show -Examples for practical usage
- Emphasize: "If you learn ONE thing today, learn to use Get-Help"
- Mention Get-Help about_* topics
SPEAKER NOTES:
- Walk through the syntax notation slowly
- Square brackets = optional, angle brackets = value type
- This is where most beginners get confused โ normalize that. It looks intimidating at first; after a few commands it's second nature.
SPEAKER NOTES:
- DEMO: Run Get-Process, then with -Name, then with -ErrorAction
- Show tab completion for parameter names
- Show truncated parameter names (e.g. -N for -Name)
- Mention aliases exist but should not be used in scripts
SPEAKER NOTES:
- DEMO: Show Get-Alias, explain why ls works in PowerShell
- Emphasize: scripts = full names, terminal = aliases are fine
- Transition: "We've been using the filesystem. Let's dive deeper."
SPEAKER NOTES:
- Short section โ two foundational concepts
- Providers = how PowerShell sees storage
- Pipeline = how commands talk to each other
SPEAKER NOTES:
- DEMO: Run Get-PSDrive, navigate to HKCU:\, browse with Get-ChildItem
- Show Env: drive โ Get-ChildItem Env:
- Key insight: same commands (Get-ChildItem, Set-Location) work everywhere
- If on Linux/macOS, note that Registry is Windows-only
SPEAKER NOTES:
- DEMO: Build this pipeline step by step, adding one pipe at a time
- Show what happens at each stage
- Emphasize the object nature โ properties, not text columns
- Mention Export-Csv, Out-File, ConvertTo-Html as pipeline endpoints
SPEAKER NOTES:
- DEMO: Export processes to CSV, open the file
- Show ConvertTo-Json output
- Transition: "We've been using built-in commands. What about adding more?"
SPEAKER NOTES:
- This block covers how PowerShell becomes extensible
- Modules = packages of commands
- Objects = the heart of PowerShell's power
SPEAKER NOTES:
- DEMO: Find-Module, Find-Command, Install-Module, Get-Command -Module
- Mention -Scope CurrentUser to avoid admin requirements on Windows PowerShell
- Show a fun module if time allows
- Key point: you don't have to write everything yourself
SPEAKER NOTES:
- DEMO: Get-Process | Get-Member โ walk through the output
- Show properties vs methods
- Access a property with dot notation
- This is THE concept that separates PowerShell from other shells
SPEAKER NOTES:
- DEMO: Build up from Get-Process to Select, Sort, Measure
- Show that Select-Object limits which properties pass through
- Transition: "Let's put this into practice with a quick challenge"
SPEAKER NOTES:
- DEMO: Walk through a real example:
"Find all services that are stopped and could be started"
1. Get-Command *service*
2. Get-Help Get-Service -Examples
3. Get-Service | Where-Object Status -eq Stopped
- Even experienced PowerShell users follow these same steps โ you never
memorize everything, you learn how to discover
- Transition: "Time for a break! Stretch, grab coffee, try some commands."
SPEAKER NOTES:
- Now we go deeper on things we've already touched
- Pipeline binding, formatting, and filtering
- These are the skills that make you productive day-to-day
SPEAKER NOTES:
- TODO: Write Trace-Command example
- DEMO: Show Trace-Command to visualize ByValue vs ByPropertyName
- Show what happens when things DON'T match
- Use Select-Object with calculated properties to reshape: @{n='ComputerName'; e={$_.ServerName}}
- This is dense โ it's OK to just understand the concept
SPEAKER NOTES:
- DEMO: Show Format-Table vs Format-List vs Format-Wide
- Show what happens when you pipe Format-Table to Export-Csv (broken!)
- Key rule: Format-* goes at the END, always
SPEAKER NOTES:
- DEMO: Show filtering with both source parameter and Where-Object
- Show common comparison operators: -eq, -ne, -gt, -lt, -like, -match
- Emphasize "filter left" โ performance matters
- Transition: "Next up โ remoting! Doing things on other machines."
SPEAKER NOTES:
- This is where PowerShell starts to feel like a superpower
- Run commands on remote machines
- Run things in the background
- Process many objects at once
SPEAKER NOTES:
- DEMO: If possible, show Enter-PSSession to localhost
- Show Invoke-Command with -ComputerName
- Explain that remoting needs to be enabled and configured
- Mention SSH-based remoting for cross-platform scenarios
SPEAKER NOTES:
- DEMO: Start a job, check status, receive results
- Mention Start-ThreadJob as the modern, faster alternative
- Jobs are great for long-running tasks you don't want to wait for
SPEAKER NOTES:
- DEMO: Show both styles side by side
- Mention ForEach-Object -Parallel for PowerShell 7+
- Key: if a cmdlet accepts arrays natively, use that instead of looping
- Transition: "Break time! Then we start scripting."
SPEAKER NOTES:
- Biggest block โ covers a lot of ground
- We transition from "running commands" to "writing scripts"
- Variables, input/output, reusable code, regex
SPEAKER NOTES:
- DEMO: Create variables, show types with .GetType()
- Reference variables with $
- Show storing command output in a variable
- Show array access: $processes[0], $processes.Count
- Keep it simple โ don't go deep on types
SPEAKER NOTES:
- DEMO: Show string expansion, single vs double quotes
- Show array creation and indexing
- Show hashtable creation and access
- These are the building blocks for scripts
SPEAKER NOTES:
- DEMO: Show the difference between Write-Output and Write-Host
- Pipe Write-Output to a variable vs Write-Host (nothing captured!)
- Mention Read-Host exists but is bad practice in scripts
SPEAKER NOTES:
- DEMO: Create a session, run multiple commands, show state persists
- Mention implicit remoting (Import-PSSession) if time allows
- This is a brief topic โ move through it quickly
SPEAKER NOTES:
- DEMO: Create a .ps1 file, run it, pass a parameter
- Show that it's literally the same commands we type interactively
- The param block is the only new concept here
SPEAKER NOTES:
- DEMO: Add CmdletBinding and Mandatory to a simple script
- Show -Verbose output appearing
- Show what happens when you don't provide a mandatory param
- Key: a few attributes make your script behave like a real cmdlet
SPEAKER NOTES:
- DEMO: Show a simple -match, access $Matches
- Show Select-String on a log file
- Don't go deep on regex syntax โ just show it exists
- Regex is a skill you build over time, not in 5 minutes
SPEAKER NOTES:
- DEMO: Open a script from the repo, walk through how to read it
- param block first โ understand the inputs and how to call the script
- process block โ that's where the main logic lives; look for it in longer scripts
- comments โ read them first, they tell you what the author was thinking
- Get-Help โ well-written scripts have comment-based help; try Get-Help .\script.ps1
- You'll spend more time reading code than writing it โ get comfortable with this process
- Transition: "Last couple blocks โ logic, errors, and wrapping up!"
SPEAKER NOTES:
- Home stretch! We're covering scripting mechanics now
- Loops, error handling, debugging, and tips
- These make the difference between "a script" and "a good script"
SPEAKER NOTES:
- DEMO: Show a simple if/else, then a foreach loop
- Mention switch statement exists but don't demo
- Remind people: prefer pipeline over explicit loops when possible
SPEAKER NOTES:
- DEMO: Show try/catch with and without -ErrorAction Stop
- Explain terminating vs non-terminating errors
- Show $_ and $_.Exception.Message
- This is critical for reliable scripts
SPEAKER NOTES:
- DEMO: Set a breakpoint in VS Code, run script, step through
- Show the Variables pane, Watch expressions
- Mention Write-Debug and -Debug switch
- VS Code debugging is the way to go for anything non-trivial
SPEAKER NOTES:
- DEMO: Show $PROFILE, create a simple profile greeting
- Show splatting with a real command
- Mention other operators: -replace, -split, -join, -contains, -in
- These are quality-of-life improvements that add up
SPEAKER NOTES:
- Quick overview โ don't dwell on each one
- Point people to Get-Help about_Operators for the full list
- These come up constantly in real scripts
SPEAKER NOTES:
- Encourage people to pick ONE thing to automate when they get back
- Mention the PowerShell community is incredibly welcoming
- Point to the GitHub repo for all session materials
- The best way to learn: use it โ find a repetitive task, automate it, break it, fix it. That's how every expert started.
SPEAKER NOTES:
- Use this as a victory lap โ you just speed-ran an entire book
- Pause and let it sink in: this is genuinely a lot of ground to cover
- Invite any final questions before the wrap-up
- Remind people: you won't remember all of this, and that's OK โ you know it exists
and you know how to find it again
SPEAKER NOTES:
- Thank everyone for spending 4 hours with you
- Point to session review in the app
- Offer to chat in the hallway track
- Share GitHub repo link one more time