The Windows PowerShell Integrated Scripting Environment, or Windows PowerShell ISE, was introduced with PowerShell 2.0
and is packaged as part of the PowerShell installation. The Windows PowerShell ISE is effectively an
integrated development environment (IDE) that is built specifically for PowerShell. Its feature set
isn't as rich as commercially available IDEs, such as Quest Software's PowerGUI or Sapien Technologies' PowerShell Studio, but it
provides the essentials, such as syntax highlighting, context-sensitive help, visual debugging
and Microsoft's IntelliSense.
The PowerShell ISE is available as a 32-bit or 64-bit
binary and
consists of three panes:
- A script pane for developing scripts;
- A shell pane for executing PowerShell commands interactively or viewing the output of a running script; and
- A commands pane for retrieving PowerShell cmdlets (organised by module).
The table below lists some of PowerShell ISE's most useful keyboard shortcuts:
Key Combination |
Action |
F5 |
Executes the script, or continues if stopped at a breakpoint. |
SHIFT + F5 |
Aborts debug (when at a breakpoint). |
F8 |
Executes the current line or the current selection. |
F9 |
Sets or clears a breakpoint on the current line (only if the script has been saved). |
F10 |
Step over. Executes the current line of code, and moves onto the next. If the current line
makes a call to a function or procedure, the function or procedure is executed as a whole. |
F11 |
Step into. Executes the current line of code, and moves onto the next. If the current line
makes a call to a function or procedure, the debugger steps into the function or procedure. |
SHIFT + F11 |
Step out. When in a function or procedure (having performed a Step into), executes
the remainder of the function or procedure, returning to the calling level. |
CTRL + BREAK |
Aborts execution. |
To quickly launch the PowerShell ISE from within PowerShell, simply use the ise
.
PowerShell has a comprehensive help system.
Help information is stored in help files, located in $PSHOME\en-US. The base installation of PowerShell V3.0 and above
does not include any help files by default, so they must be downloaded from Microsoft's Web site.
If you are using a computer with Internet connectivity, this can be achieved using the Update-Help cmdlet. You can
also manually download the help files from Microsoft's Web site, or use the Save-Help cmdlet to download the files and save them
for use elsewhere.
To obtain information regarding a particular cmdled or concept, use the Get-Help cmdlet (or one of its
, such as help or man).
For example, to find out about the Get-Process cmdlet, type:
PS C:\Users\JohnDoe>
Get-Help Get-Process;
NAME
Get-Process
SYNOPSIS
Gets the processes that are running on the local computer or a remote computer.
SYNTAX
Get-Process [[-Name]
] [-ComputerName ] [-FileVersionInfo] [-Module] []
Get-Process [-ComputerName ] [-FileVersionInfo] [-Module] -InputObject []
Get-Process [-ComputerName ] [-FileVersionInfo] [-Module] -Id []
Get-Process -Id -IncludeUserName []
Get-Process -IncludeUserName -InputObject []
Get-Process [[-Name] ] -IncludeUserName []
DESCRIPTION
The Get-Process cmdlet gets the processes on a local or remote computer.
Without parameters, Get-Process gets all of the processes on the local computer. You can also specify a particular
process by process name or process ID (PID) or pass a process object through the pipeline to Get-Process.
...
...
...
Stop-Process
Wait-Process
REMARKS
To see the examples, type: "get-help Get-Process -examples".
For more information, type: "get-help Get-Process -detailed".
For technical information, type: "get-help Get-Process -full".
For online help, type: "get-help Get-Process -online"
PS C:\Users\JohnDoe>
The default output from Get-Help provides a synopsis of the given command. To retrieve more detailed
information, use the -Detailed parameter. To retrieve a full description, use the -Full parameter.
If you only wish to view examples of the given cmdlet or concept, use the -Examples parameter.
The help system contains numerous articles about general PowerShell concepts. To list the available articles, type:
PS C:\Users\JohnDoe> Get-Help about_;
Name Category Module Synopsis
---- -------- ------ --------
about_Aliases HelpFile Describes how to use alternate names for cmdle...
about_Arithmetic_Operators HelpFile Describes the operators that perform arithmeti...
about_Arrays HelpFile Describes arrays, which are data structures de...
about_Assignment_Operators HelpFile Describes how to use operators to assign value...
about_Automatic_Variables HelpFile Describes variables that store state informati...
about_Break HelpFile Describes a statement you can use to immediate...
about_Classes HelpFile Describes how you can use classes to develop i...
about_Command_Precedence HelpFile Describes how Windows PowerShell determines wh...
about_Command_Syntax HelpFile Describes the syntax diagrams that are used in...
about_Comment_Based_Help HelpFile Describes how to write comment-based help topi...
about_CommonParameters HelpFile Describes the parameters that can be used with...
...
...
...
about_Checkpoint-Workflow HelpFile Describes the Checkpoint-Workflow activity, which
about_Foreach-Parallel HelpFile Describes the ForEach -Parallel language const...
about_InlineScript HelpFile Describes the InlineScript activity, which run...
about_Parallel HelpFile Describes the Parallel keyword, which runs the
about_Sequence HelpFile Describes the Sequence keyword, which runs sel...
about_Suspend-Workflow HelpFile Describes the Suspend-Workflow activity, which...
about_WorkflowCommonParameters HelpFile This topic describes the parameters that are v...
about_Workflows HelpFile Provides a brief introduction to the Windows
PS C:\Users\JohnDoe>
To list all available help topics, simply type:
PS C:\Users\JohnDoe> Get-Help *;
Name Category Module Synopsis
---- -------- ------ --------
foreach Alias ForEach-Object
% Alias ForEach-Object
where Alias Where-Object
? Alias Where-Object
ac Alias Add-Content
clc Alias Clear-Content
cli Alias Clear-Item
clp Alias Clear-ItemProperty
clv Alias Clear-Variable
compare Alias Compare-Object
cpi Alias Copy-Item
cpp Alias Copy-ItemProperty
...
...
...
As we've already seen, PowerShell works natively with objects exposed by the underlying operating system, the .NET framework, and
any loaded modules or snap-ins. You will therefore find yourself
dealing with various object classes when using the interactive shell, or when developing PowerShell scripts. Understanding
the object types you are working with, and exploring their respective methods and properties, will enable you to exploit the true
potential of PowerShell.
If you don't already know the class of the object you are working with, you can use the GetType() method. For example, the code
excerpt below returns the data type of the first thread of an arbitrary process:
PS C:\Users\JohnDoe> $objFirstProcess = (Get-Process)[0]; # Get first process.
PS C:\Users\JohnDoe> $objFirstThread = $objFirstProcess.Threads[0]; # Get first thread of first process.
PS C:\Users\JohnDoe> $objFirstThread.GetType().FullName; # Get the class of the thread object.
System.Diagnostics.ProcessThread
PS C:\Users\JohnDoe>
Once you know the class of an object, you can call upon resources such as the Microsoft Developer Network (MSDN) to obtain detailed information about
the class' properties and methods. Continuing with the example above,
performing a Bing or Google search for msdn System.Diagnostics.ProcessThread quickly takes us to the relevant MSDN page, that is:
https://msdn.microsoft.com/en-us/library/system.diagnostics.processthread(v=vs.110).aspx.
From here, we can ascertain the various properties and methods of the given class.
You can also explore an object's properties and methods directly by using the Get-Member cmdlet (or its
, gm), for example:
PS C:\Users\JohnDoe> $objFirstThread | Get-Member;
TypeName: System.Diagnostics.ProcessThread
Name MemberType Definition
---- ---------- ----------
Disposed Event System.EventHandler Disposed(System.Object, System.EventArgs)
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
ResetIdealProcessor Method void ResetIdealProcessor()
ToString Method string ToString()
BasePriority Property int BasePriority {get;}
Container Property System.ComponentModel.IContainer Container {get;}
CurrentPriority Property int CurrentPriority {get;}
Id Property int Id {get;}
IdealProcessor Property int IdealProcessor {set;}
PriorityBoostEnabled Property bool PriorityBoostEnabled {get;set;}
PriorityLevel Property System.Diagnostics.ThreadPriorityLevel PriorityLevel {get;set;}
PrivilegedProcessorTime Property timespan PrivilegedProcessorTime {get;}
ProcessorAffinity Property System.IntPtr ProcessorAffinity {set;}
Site Property System.ComponentModel.ISite Site {get;set;}
StartAddress Property System.IntPtr StartAddress {get;}
StartTime Property datetime StartTime {get;}
ThreadState Property System.Diagnostics.ThreadState ThreadState {get;}
TotalProcessorTime Property timespan TotalProcessorTime {get;}
UserProcessorTime Property timespan UserProcessorTime {get;}
WaitReason Property System.Diagnostics.ThreadWaitReason WaitReason {get;}
PS C:\Users\JohnDoe>
Again, continuing with the example above, we can see that the PriorityLevel of a thread can be both viewed and modified {get;set;}, meaning we could do something like:
PS C:\Users\JohnDoe> $objFirstThread.PriorityLevel = 'Highest';
PS C:\Users\JohnDoe>
This has the effect of modifying the Base Priority of the given thread, changing it from
Normal to
Highest.
This operation can only be performed with appropariate privileges, and when launching PowerShell with the Run as administrator option.
So, with just three lines of code, we have managed to change the Base Priority of a process' thread. Without PowerShell, this would only
be possible using a lengthy piece of Python, VBScript or a compiled program.
We can also use of PowerShell's cmdlets
to view actual object data. The Out-GridView cmdlet, introduced in PowerShell V3.0, is particularly useful, as it allows
us to quickly browse object data in a .NET GridView control, for example:
PS C:\Users\JohnDoe> $objFirstProcess.Threads | Select-Object -Property * | Out-GridView;
PS C:\Users\JohnDoe>
From here, we can explore the object's property values. Of course, this technique can be combined with the MSDN approach above to fully
understand a given object class.