This post is a list of resources and tips to help anyone new to Windows Powershell in getting started with the language. If Powershell is completely new to you, I recommend you review all of the listed resources. If you find other great resources along the way, please feel free to comment below and i'll contribute them to this list.

Getting Started

Getting Started with PowerShell 3.0 Jump Start (video series)

This Jump Start Microsoft PowerShell course is designed to teach busy IT professionals, admins, and help desk persons about how to use PowerShell to improve management capabilities, automate redundant tasks, and manage the environment in scale. Through this PowerShell tutorial, learn how PowerShell works – and how to make PowerShell work for you – from experts Jeffrey Snover, the inventor of PowerShell, and Jason Helmick, Senior Technologist at Concentrated Technology.

Although this was released around Powershell 3 (and we're currently on version 5) this is still a very relevant introduction to Powershell, as each new version of Powershell builds on the last.

My 12 PowerShell Best Practices (Blog Series)

A 12-part series of posts entitled "What To Do / Not To Do in PowerShell." These summarize my 12 major best practices for the shell, many of which are also enthusiastically endorsed by the broader PowerShell community.

This promotes some essential best practices that will make your scripts more robust and easier for others to read/understand, so it's a good idea to develop these habits early.

Powershell Basic Cheat Sheet (PDF)

PowerShell is a task based command line shell and scripting language. To run it, click Start, type PowerShell, run PowerShell ISE or PowerShell as Administrator. Commands are written in verb-noun form, and named parameters start with a dash.

This is worth printing and keeping nearby when coding as a handy reference guide to the basic constructs and conventions.

How to Install Windows 2016 TP5 (Blog Post)

This blog post (by me :) ) takes you through how to road test Windows Server 2016 Technical Preview 5 using VMWare Player as a desktop hypervisor. Note that you'll need to do this on a machine with a fair amount of spare RAM. While this isn't strictly a Powershell resource, having a server VM to play around with is useful when learning Powershell.

This earlier blog post details how to install the trial version of the latest Windows Operating system where you can play around with the latest version of Powershell on the latest OS. You might want to spin up multiple machines if you want to experiment with using Powershell to communicate between servers.

Powerscripting Podcast (Podcast)

Shortly after PowerShell's introduction to the world, Jon Walz and Hal Rottenberg launched the PowerScripting Podcast, a weekly show featuring expert guest speakers, fantastic behind-the-scenes information, members of the PowerShell community, and more.

The more recent shows tend to be interviews on developments in Powershell and the community, but go back to episode 1 and the first 20 or so episodes do a good job of explaining and exploring the basics and this is a good way to use dead time such as a commute to immerse yourself in Powershell.

Learn Powershell in a Month of Lunches (Book / eBook)

Learn Windows PowerShell in a Month of Lunches is an innovative tutorial designed for busy administrators. Author Don Jones has taught thousands of administrators to use PowerShell, and now he brings his years of training techniques to a concise, easy-to-follow book. Just set aside one hour a day—lunchtime would be perfect—for an entire month, and readers will be automating administrative tasks faster than they ever thought possible.

I have not personally read it, but this book is recommended almost everywhere as a great way to learn Powershell.

General Tips

  • Google is your friend, but beware that as parameters start with a hyphen you might need to enclose some of your search with speechmarks as using a hyphen in a Google search means to exclude that term by default. E.g: instead of get-aduser -properties do get-aduser "-properties"
  • StackExchange is your other friend and someone has probably already asked your question: http://stackoverflow.com/questions/tagged/powershell
  • The console and ISE both support tab completion, so you can type part of a cmdlet name then tab through the options. Also the ISE has intellisense, it will show tooltips to help you complete commands and it will red underline coding errors.
  • Get-Help is sometimes helpful (although Technet or ss64 are likely easier to read), e.g get-help get-service. Also try using it with any of these parameters: -examples -detailed or -full.
  • Powershell is all about the pipeline. Cmdlets return collections of results known as "objects" that can be passed forward down the pipeline in to other cmdlets to manipulate the result set. In particular, get to grips with where-object, select-object and foreach-object (and bear in mind these are sometimes used via their "alias" which are ?, select and % respectively)
  • Get-Member is incredibly helpful, as it shows you all the properties and methods for an object (and can help you to understand what type of object you are handling). To use get-member just pipe an object to it. For example:
PS C:\Users\mwragg> get-service | get-member


   TypeName: System.ServiceProcess.ServiceController

Name                      MemberType    Definition  
----                      ----------    ----------
Name                      AliasProperty Name = ServiceName  
RequiredServices          AliasProperty RequiredServices = ServicesDependedOn  
Disposed                  Event         System.EventHandler Disposed(System.Object, System.EventArgs)  
Close                     Method        void Close()  
Continue                  Method        void Continue()  
CreateObjRef              Method        System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)  
Dispose                   Method        void Dispose(), void IDisposable.Dispose()  
Equals                    Method        bool Equals(System.Object obj)  
ExecuteCommand            Method        void ExecuteCommand(int command)  
GetHashCode               Method        int GetHashCode()  
GetLifetimeService        Method        System.Object GetLifetimeService()  
GetType                   Method        type GetType()  
InitializeLifetimeService Method        System.Object InitializeLifetimeService()  
Pause                     Method        void Pause()  
Refresh                   Method        void Refresh()  
Start                     Method        void Start(), void Start(string[] args)  
Stop                      Method        void Stop()  
WaitForStatus             Method        void WaitForStatus(System.ServiceProcess.ServiceControllerStatus desiredStat...  
CanPauseAndContinue       Property      bool CanPauseAndContinue {get;}  
CanShutdown               Property      bool CanShutdown {get;}  
CanStop                   Property      bool CanStop {get;}  
Container                 Property      System.ComponentModel.IContainer Container {get;}  
DependentServices         Property      System.ServiceProcess.ServiceController[] DependentServices {get;}  
DisplayName               Property      string DisplayName {get;set;}  
MachineName               Property      string MachineName {get;set;}  
ServiceHandle             Property      System.Runtime.InteropServices.SafeHandle ServiceHandle {get;}  
ServiceName               Property      string ServiceName {get;set;}  
ServicesDependedOn        Property      System.ServiceProcess.ServiceController[] ServicesDependedOn {get;}  
ServiceType               Property      System.ServiceProcess.ServiceType ServiceType {get;}  
Site                      Property      System.ComponentModel.ISite Site {get;set;}  
Status                    Property      System.ServiceProcess.ServiceControllerStatus Status {get;}  
ToString                  ScriptMethod  System.Object ToString();  
  • If you have a complex command that is being piped between multiple cmdlets, step backwards (removing parts of the pipeline) so you can see that the output is as you expect at each stage. For example:
PS C:\Users\mwragg> get-service | where-object {$_.displayname -like "Windows*"} | select-object status | where-object {  
$_.status -eq "Running"} | measure-object | select count

Count  
-----
   11


PS C:\Users\mwragg> get-service | where-object {$_.displayname -like "Windows*"} | select-object status | where-object {  
$_.status -eq "Running"}

 Status
 ------
Running  
Running  
Running  
Running  
Running  
Running  
Running  
Running  
Running  
Running  
Running


PS C:\Users\mwragg> get-service | where-object {$_.displayname -like "Windows*"}

Status   Name               DisplayName  
------   ----               -----------
Running  AudioEndpointBu... Windows Audio Endpoint Builder  
Running  Audiosrv           Windows Audio  
Running  EventLog           Windows Event Log  
Running  FontCache          Windows Font Cache Service  
Running  FontCache3.0.0.0   Windows Presentation Foundation Fon...  
Stopped  icssvc             Windows Mobile Hotspot Service  
Stopped  LicenseManager     Windows License Manager Service  
Running  MpsSvc             Windows Firewall  
Stopped  msiserver          Windows Installer  
Stopped  SDRSVC             Windows Backup  
Stopped  stisvc             Windows Image Acquisition (WIA)  
Stopped  TrustedInstaller   Windows Modules Installer  
Running  W32Time            Windows Time  
Stopped  WbioSrvc           Windows Biometric Service  
Running  Wcmsvc             Windows Connection Manager  
Stopped  wcncsvc            Windows Connect Now - Config Registrar  
Stopped  WcsPlugInService   Windows Color System  
Stopped  WdNisSvc           Windows Defender Network Inspection...  
Stopped  Wecsvc             Windows Event Collector  
Stopped  WEPHOSTSVC         Windows Encryption Provider Host Se...  
Stopped  WerSvc             Windows Error Reporting Service  
Stopped  WinDefend          Windows Defender Service  
Running  Winmgmt            Windows Management Instrumentation  
Stopped  WinRM              Windows Remote Management (WS-Manag...  
Stopped  WMPNetworkSvc      Windows Media Player Network Sharin...  
Stopped  WpnService         Windows Push Notifications Service  
Running  WSearch            Windows Search  
Stopped  WSService          Windows Store Service (WSService)  
Stopped  wuauserv           Windows Update  
Running  wudfsvc            Windows Driver Foundation - User-mo...  
  • In the ISE, press CTRL+J to load templates for various scripting constructs such as cmdlets, loops, if else, try catch blocks and more. Note that it will drop the template in to whatever script/window you have open and wherever the cursor currently is.

Further Topics

Powershell Cheat Sheet (PDF)

This is a more detailed Cheat Sheet similar to the Basic Cheat Sheet above that provides more detailed/advanced conventions.

Worth printing and keeping nearby when you're starting to use more advanced concepts.

An introduction to Powershell Modules (Blog Post)

For PowerShell to provide specialised scripting, especially for administering server technologies, it can have the range of Cmdlets available to it extended by means of Snapins. From version 2 there is an easier and better method of extending PowerShell: the Module. These can be distributed with the application to be administered, and a wide range of Cmdlets are now available to the PowerShell user. PowerShell has grown up.

Modules extend Powershell with additional cmdlets and you can create your own to package together a set of functions or cmdlets you've written.
Tip: In the Powershell ISE, press CTRL+J and select cmdlet (advanced function) to load a template for creating a cmdlet that you could save as a module.

Advanced Tools & Scripting with PowerShell 3.0 Jump Start (Video Series)

Take this advanced PowerShell scripting course to find out how to turn your real time management and automation scripts into useful reusable tools and cmdlets. You’ll learn the best patterns and practices for building PowerShell scripts and maintaining tools, and you’ll pick up some special tips and tricks along the way from the architect and inventor of PowerShell, Distinguished Engineer Jeffrey Snover, and IT Pro, Jason Helmick.

Not one to start with, but once you've mastered the basics this will help guide you to developing more advanced tools and scripts with Powershell.

Active Directory Powershell Quick Reference (PDF)

A Cheat Sheet for working with the Active Directory module for Powershell that covers various constructs.

Very useful guide for when you need to work with the Active Directory cmdlets (import-module activedirectory on a Domain Controller, or having installed AD tools).

Powershell Slack Community (Live Chat)

Slack is a chat tool similar to Hipchat. Powershell.slack.com has an active community of Powershell experts that you can discuss things with and also bridges various other IRC-based Powershell channels.

An opportunity to ask questions to a community and get a (likely) instantaneous response.
Note you need sign up first, but it's automated.