Important: take note of PowerShell is open sourced and is available on Linux | Blog | Microsoft Azure which is exciting news! This means we will soon be able to use PowerShell on Windows, Linux and Mac. Although we can use Bash on all three platforms too! As of January 2018 PowerShell Core is available on all three platforms and has been released, see PowerShell Core 6.0: Generally Available (GA) and Supported! | PowerShell Team Blog for details.
Possibly the best place to start from when new to PowerShell is PowerShell Documentation | Microsoft Docs, closely followed by Scripting with Windows PowerShell on Microsoft's website, which is a great launchpad for getting an introduction to PowerShell as well as digging deeper. There is some background information on PowerShell at Windows PowerShell - Wikipedia, the free encyclopedia which I have also found helpful.
It is important to note that "PowerShell Core" is the cross platform version of PowerShell and it is built on .NET core, you can get it from PowerShell/PowerShell: PowerShell for every system! and it can be installed on Windows alongside regular PowerShell, which is technically called "Windows PowerShell". The difference between Windows PowerShell and PowerShell Core is explained at PowerShell 6.0 Roadmap: CoreCLR, Backwards Compatibility, and More! | PowerShell Team Blog. In addition Getting Started with PowerShell Core on Windows, Mac, and Linux | PowerShell Team Blog is a great article to help you get started with PowerShell Core.
It is also worth noting that PowerShell has "Language Modes" where PowerShell can be placed into a restrictive mode for security reasons. This is to do with the security of the device PowerShell is running on and is designed to help prevent malicious attacks. See about_Language_Modes | Microsoft Docs.
If you want to know which version of PowerShell you are running then open an interactive PowerShell and type $PSVersionTable
you can see from the list "PSVersion" which tells you which version you have and also "PSCompatibleVersions" which tells you which versions of PowerShell you have compatibility with.
If $PSVersionTable.PSEdition
returns a null then it is an old version of PowerShell Windows, otherwise it will return "Core" or "Desktop" where Core means PowerShell Core and Desktop means full PowerShell Windows.
I have however noted that whilst my Windows 7 laptop and Windows Server 2012 R2 VM have the same PowerShell versions and "compatible versions" the available cmdlets are different. For example a lot of useful networking and IP related cmdlets like Get-NetIPAddress are only in Windows 8 or Server 2012 and above.
Should you happen to need PowerShell 2.0 for Windows XP then use the following link: Download Update for Windows XP (KB968930) from Official Microsoft Download Center, however I strongly recommend you stop using Windows XP as it stopped getting security updates in April 2014 and so is not safe to use. However there are variants of Windows XP in the embedded and retail space which are still being supported but not for long.
The best place to start is PowerShell Documentation | Microsoft Docs, from where you will find everything you need. Another good starting point is Windows PowerShell Core About Topics which is almost a language reference. There is also Windows PowerShell User's Guide probably a better pace for starting. There is also Explain PowerShell which will explain "one liners" and provide links to the Microsoft documentation.
If there is a CmdLet you want help with then one easy way to get to the Microsoft documentation is as follows:Get-Help Where-Object -Online
Clearly you can change "Where-Object" for any other Microsoft CmdLet. The "-Online" option basically launches your default web browser.
Sometimes the documentation you want is more along the lines of "What was that command again?", well there is help! You remember it was something to do with items, in which case try Get-Command *item*
and you will get a list of all the CmdLets with the word "item" somewhere in their name, nice!
You might need to run a Update-Help
to get updates and so on but Get-Help about_
should list all the very helpful "about" help entries. See PowerShell Basics: Meet About - The Owner's Manual for PowerShell - Microsoft Tech Community - 668443 for more details on this.
It is always good to adopt "best practice" or at least be consistent. Working off a common standard helps everyone. Having your code reviewed and checked is also a good thing. Thus it is well worth checking out PSScriptAnalyzer details on which you can find at PowerShell/PSScriptAnalyzer: Download ScriptAnalyzer from PowerShellGallery with more help and advice at PSScriptAnalyzer deep dive - Part 1 of 4 - Hey, Scripting Guy! Blog.
These cmdlets are ones I have used and found helpful, clearly there are many more:
-ShowWindow
option was missing from PowerShell 6, but is back in PowerShell 7Building on this, it is worth noting that when using Start-Process in a script called from IBM's Tivoli Workload Scheduler (TWS) I had to use -Wait
, -RedirectStandardOutput
and -NoNewWindow
and then get the output file back in order to show the external process output on the console for TWS to pick up, skipping the redirect command caused some funny issues.
It seems that there are three options, a "read line" approach which requires the enter key to be pressed, a "detect key press" approach and a "message box" technique. None of them are especially hard. The simple "detect key press" is documented at Windows PowerShell Tip: Press Any Key to Continue and the "message box" is explained at Converting VBScript's MsgBox Function . The key press approach does not work from PowerShell ISE and so How to Properly Pause a PowerShell Script gives a more complete solution.
The easy way to parse, search or scan a Windows Event Log is to use the standard Event Viewer, which is either available standalone or via Computer Management. However you can also use PowerShell, which is much more flexible. The obvious cmdlet to use is Get-EventLog, however, whilst being good and flexible has a major issue, in that when working with a remote computer it drags everything local before filtering with Where-Object. So, the preferred cmdlet is Get-WinEvent which is harder to use but the investment is worth it, see Use PowerShell Cmdlet to Filter Event Log for Easy Parsing - Hey, Scripting Guy! Blog - Site Home - TechNet Blogs for more information on this.
My code editing tools of choice are Notepad++ and UltraEdit, and you will find more about them both on this website. However a "hard core" PowerShell scripting friend uses PowerGUI: Simplify your PowerShell and recommends it, so I am passing on his recommendation, because I respect his view, he said:
There are a couple of reasons why I like PowerGUI: You can single step through the script when testing/debugging. It has "Intellisense" style features that will offer the methods, variables and parameter names. Intellisense feature also works with SnapIns and Modules (SharePoint and Azure as an example) and once they have been run, any userdefined functions you have in the scripts.So, well worth looking at!
I have also seen POSHGUI which is "Free Online PowerShell Tools", not used it myself but worth a look.
This might also be worth considering: PowerShell Studio | The Most Powerful Windows PowerShell GUI Designer and Script Debugger Available
Having installed IntelliJ IDEA: The Java IDE for Professional Developers by JetBrains for Java development, I found that you can add a plugin for PowerShell support, and this is actually quite a usable solution. See ant-druha/PowerShell: Adds PowerShell language support to IntelliJ-based IDEs.
If you type something like "Get-ChildItem -" and then press the tab key, on Windows with PowerShell you will get to cycle through the possible switches, one at a time. With PowerShell Core you get the whole list displayed. Interesting and handy.
If you fancy changing the prompt in a PowerShell session then just enter the following at the prompt:
function prompt{ $currentDirectory = Split-Path (Get-Location) -Leaf "PS: $currentDirectory\>" }This will change the prompt from something like: PS C:\Development\PowerShell\Demos>
function prompt{ $currentDirectory = Split-Path (Get-Location) -Leaf ; "PS: $currentDirectory\>" }This technique helps keep the prompt shorter and cleaner. This however is not a permanent change, it only applies to the current session. To make it permanent you would need to get the new "prompt" function into the profile. Read about_Prompts | Microsoft Docs for all the details on this and some more information on how the prompt function works.
PowerShell and Slack – Rambling Cookie Monster - using Slack from PowerShell
This is the starting point for several things PowerShell. The plan is to expand this over time but for now, if you need to get started then http://www.drdobbs.com/windows/powershell-for-developers-with-admin-tas/240150040 is a good place to start.
Also see the Regular Expression page for details for doing grep in PowerShell.
There is a nice script at Script PowerShell: Get Specific Files From Zip Files which is a good example of several things but primarily working with Zip files.
Desired State Configuration or DSC is supposed to be very good, note that Developers perspective on PowerShell Desired State Configuration – IndexOutOfRange is a good summary but is not an introduction or tutorial!
It is very easy to get PowerShell to generate HTML output and also not too hard to customise this output so it is easier to read, see Building HTML reports in PowerShell with ConvertTo-Html – 4sysops for details.
An interesting way to handle parameters, neatly: PowerShell splatting – 4sysops