Wednesday, July 31, 2013

Building GUI for PowerShell Scripts using PowerShell Studio 2012

Why a GUI ?

A GUI can often make a task easier and more constrained for less experienced users for example our "Service Desk" Folks.

PowerShell is built on the .NET framework which has entire set of capabilities for building GUI's.

These capabilities are accessible to powershell but require quite lengthy and complicated coding.

To avoid this complications i recommend using a Nice Tool from Sapien, PowerShell Studio 2012.


PowerShell Studio gives you the tools you need to bring your PowerShell tasks to successful completion.

























PowerShell Studio Enables you to package your script into executables (.exe) and share it with others who have relatively less scripting experience.

You can download the free trial from 

http://www.sapien.com/software/powershell_studio

After the Trial Expires you can extend the functionality by procuring a license key from sapien.


You can also use  Primal Forms Community Edition, No Export to Executable option in Primal Forms Community Edition.



However You can export to ps1 and integrate it in your script :)

PowerShell Studio 2012 - Key Features

  • PowerShell Console - Not just one, but two hot-swappable consoles: 32-bit and 64-bit
  • PowerShell Script Editor - Awesome Script Editor, But now PowerShell v3-v4 script editor also turn out be a good option.
  • PowerShell Forms Designer -An easy Drag and Drop way of creating PowerShell Scripts, saves lots of time and error by doing it the manual way.

Don't expect that You Cannot build a New Version of Microsoft Word or Excel with this Tool :), Complicated Multi-Window applications are possible but very complex, Stick with Simple Forms for collecting and displaying data, also don't forget 

Out-GridView - An easy way to turn output to graphical view.

"Lets See a Practical Example, We Will create a very simple Tool to extract System Properties for a Server.

This tool when run would as the user to input a server name and based on the server name it would display its BIOS,Computer System and Processor Information."

Here a look at the Final Tool and also its .exe file (with a custom icon).
















So let me illustrate the steps on how you can build this nice tool

1) Open PowerShell Studio 2012 and Click on New, New Form Project, Feed in the Project Name in my example its "System Information" and click on Create.

































You would see a similar screen as below, Double click on "Main Form.pff"






















2) Next  we need to add controls to the main form, Click on Object Browser on the left pane and append the appropriate control objects to the form, below i have shown a screen cap of which all controls need to be appended from the object browser.


Once you append the controls to the MainForm, next you need to change certain properties for the control objects.

Here is a list of changes which you would need to make on each control.

  • Label - Change the text property to "Server Name" and "Select System Property".
  • ComboBox - Change the Drop down style to Dropdown list so that users cannot manipulate its values.
  • Button - Change the text property to "Reset Server Name" and "Go!!".
  • MainForm -  Change the text property to "System Information"
Next we will start with the actual coding, Double click on the Form in GUI which would open up the Script view of the form $OnloadFormEvent. Inside it we would initialize the Array of objects and also add the same to the combobox.



$OnLoadFormEvent={

#TODO: Initialize Form Controls here

# Create an Array for List of Properties which the user sees

$array = @("Bios_Information","Computer_System_Information","Processor_Information")

# Appending the list of items in $array to combobox

$array | ForEach-Object {Load-ComboBox -ComboBox $combobox1 -Append -Items $_ }


}

Next we again go back to the designer view and double click on the "Reset Server Name" Button which would take us to its "Click" event.

When a user clicks on this button it would call a clear method on textbox1 which would result in clearing its contents.





$buttonResetServerName_Click={

 #TODO: Place custom script here

 $textbox1.Clear()

}
Next we again go back to the designer view and double click on the "Go!!" Button which would take us to its "Click" event.

This is what the script is all about, When a user types in the server name in textbox and selects one of the system property of his interests and clicks this button an Out-Grid view form would pop up which would show a detailed report for the system for that particular system property .

Also note i have illustrated a small sample of how we can use the Try/catch block to trap errors. 

For example if the user types in a wrong system name which is not reachable over network or is shutdown an appropriate warning error message box would pop up.

Also note that with the PowerShell Studio Snippet view has a message box snippet which when dragged into the script drops in a scriptblock for "MessageBox" without the need for any additional coding.


Here's the Script which we need to type in to the "Go" Button Event.


$buttonGo_Click={

#TODO: Place custom script here

# Work only if Textbox1.text input is Not Null.

if ($textbox1.Text -ne $null)

# Selected index is greater than -1 (0,1,2), Iterate for each selected item  generate bios info and Out-grid view

 if ($combobox1.SelectedIndex -gt -1 -and $combobox1.SelectedItem -eq "Bios_Information")

 {

$servername = $textbox1.Text

 Get-WmiObject -Class win32_bios -ComputerName $servername -ea 'Stop' |

 Out-GridView -Title "$($combobox1.SelectedItem) for $servername"

}

# Selected index is greater than -1 (0,1,2), Iterate for each selected item  generate bios info and Out-grid view

 elseif ($combobox1.SelectedIndex -gt -1 -and $combobox1.SelectedItem -eq "Computer_System_Information")

 {

$servername = $textbox1.Text

Get-WmiObject -Class Win32_ComputerSystem -ComputerName $servername -ea 'Stop' |

 Out-GridView -Title "$($combobox1.SelectedItem) for $servername"

 }

 <# Selected index is greater than -1 (0,1,2), Iterate for each selected item  generate processor info and Out-grid view, error action stop

 so that we can trap the error in try catch block #>

 elseif ($combobox1.SelectedIndex -gt -1 -and $combobox1.SelectedItem -eq "Processor_Information")

 {


$servername = $textbox1.Text

 Get-WmiObject -Class Win32_Processor -ComputerName $servername -ea 'Stop' |

 Out-GridView -Title "$($combobox1.SelectedItem) for $servername"

 }

 }

 }

 # Pop up a windows message box indicating the type of error.

 catch {
 [void][System.Windows.Forms.MessageBox]::Show(" $($servername) is ShutDown or not Reachable over the Network","Information")
 }


Once you are set with the scripting part, Hit "Ctrl + F4" or the "Run Project Button" on the Home Ribbon to test out the tool







Once you feel that the script and the UI work as per your requirement, Package and convert the tool to an exe using the 'Package Button" located on the Export Ribbon









Here i have illustrated a small demo of how the Final Execution of the Tool Would Look.














Here i enter the server name and from the dropdown box i select BIOS information and Click on Go!!, an Out-Grid window would pop up with the details


Similarly we would test out the same for CPU information by selecting CPUInformation from drop down box

Nice, so you can see our tool works perfectly fine.

Next lets take the last use case where in i enter a systemname which doesnot exists or is not reachable over network, here our try catch block would kick in and throw an error message that the system does not exists or is not reachable over network

Note that you can dig more into the try-catch block and trap each unique error with its unique catch block.

I hope this blog post helps you in paving the stepping stone for you PowerShell Script GUI's.

9 comments:

  1. Nice review of GUIs and PowerShell Studio

    ReplyDelete
  2. Right, it is very good IDE, but it is very expensive..

    ReplyDelete
  3. Not really that expensive. You need to get it on a good sale when they occur. Even then, a great tool is worth it's weight in gold.

    ReplyDelete
  4. What do think, which is the best portable PowerShell editor with intellisense?

    ReplyDelete
  5. @Zachary Loeber - I will be waiting for discount for PS Studio 2012.. :)

    ReplyDelete
  6. Keep getting this error when running your script:

    The term 'Load-Combobox' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

    ReplyDelete
  7. Cool starter project. Unfortunately there seem to be several problems with the code. If you try to run it you get several errors. You seem to have missed your try statement in your code. Even once it's added there are several problems with missing brackets.

    ReplyDelete
  8. working code available here:

    http://poshcode.com/4485

    ReplyDelete