HTML Applications (HTA) are very useful to provide a Graphical User Interface (GUI) to your VBscript, to ease its use, avoid typing mistakes and provide better output.
Would it be possible to do similar thing in PowerShell?
Unfortunately, Powershell does not allow you to use HTA as you can do to provide a GUI for your VBscripts.
However, Powershell gives you access to .Net libraries which means that you can create a GUI using Windows Forms. Here is a example of what it looks like:
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "My PowerShell Form"
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(20,20)
$objLabel.Text = "Hello World!"
$objForm.Controls.Add($objLabel)
$ExitButton = New-Object System.Windows.Forms.Button
$ExitButton.Location = New-Object System.Drawing.Size(80,80)
$ExitButton.Text = "Exit"
$ExitButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($ExitButton)
$objForm.ShowDialog()
You can copy the code in file, save it as test.ps1 and execute the script with PowerShell; you'll see a GUI like this:
This is not an easy task as Windows Forms will require a lot more coding than HTA, but you can design really nice interfaces for your scripts.
In order to ease the delivery of forms, without having to type hundreds of lines of code, you can use a free tool from Sapien to create the code behind the GUI called PrimalForms. You'll be able to design the GUI and it will generate the code for you. Then, all you have to do is to merge the "GUI code" into your script and link the events.
To find PrimalForms Community Edition, you'll have to access the download section on Sapien website and create an account. I'm telling you: it's worth doing it, and it's free.
References:
System.Windows.Forms Namespace
Sapien - PrimalForms Community Edition
Showing posts with label HTA. Show all posts
Showing posts with label HTA. Show all posts
Wednesday, 29 August 2012
Tuesday, 6 March 2012
How to Add an Exit Function to a HTA
Following my previous post about the WScript.sleep function, here is an function to add to an exit function to a HTA.
Again, using HTA is really useful to bring life to a VBScript by adding an interface. So, converting your VBScript files to a HTA is not really complicated as VBScript is native, however some functions like the WScript.Quit are not available.
In a HTA, an easy way of exiting is to call the close method of the current Window object (self). Then, you have just to call the sbExitHTA sub to close the Window.
Also, if you want to get rid of the close button from the Windows title bar, add SysMenu="no" in the HTA:APPLICATION section.
<html>
<head>
<title>Simple HTA</title>
<HTA:APPLICATION
ID="oSimpleHTA"
APPLICATIONNAME="SimpleHTA"
>
</head>
<script Language="VBScript">
Sub Window_Onload
dataarea.innerhtml = "<p>This is a simple HTA</p>" & _
"<p>Exit button: </p>" & _
"<input type=""button"" value=""Exit"" onClick=""sbExitHTA"" />"
End Sub
Sub sbExitHTA
Self.Close()
End Sub
</script>
<body>
<h1>Simple HTA</h1>
<span id="dataarea"></span>
</body>
</html>
How to add a sleep function to an HTA
The WScript.Sleep function in VBScript is useful. However, when you decide to use HTA to provide an interface to your script, the sleep function become a problem as you can't use WScript functions in HTA.
For the WScript.Echo, you can use MsgBox, however, there is no equivalent for the WScript.Sleep.
You could do it using a loop, that's working but it's resource intensive. You could also create a VBScript file on the fly where you include the WScript.Sleep command and run it via the HTA but there is an easier, faster and quite efficient solution.
So, here is an option that I used several times which did the trick for me.
In the following example, the sbWait sub is run a command line to do a ping to the localhost IP address for the number of times of your choice. Because each ping request is done every second, you just have to mention using the iSeconds variable the number of time you want to do it.
Enjoy.
<html>
<head>
<title>Simple HTA</title>
<HTA:APPLICATION
ID="oSimpleHTA"
APPLICATIONNAME="SimpleHTA"
>
</head>
<script Language="VBScript">
Sub Window_Onload
dataarea.innerhtml = "<p>This is a simple HTA</p>"
dataarea.innerhtml = "<p>Let's wait for 5 seconds</p>"
sbWait(5)
dataarea.innerhtml = "<p>Done.</p>"
End Sub
Sub sbWait(iSeconds)
Dim oShell : Set oShell = CreateObject("WScript.Shell")
oShell.run "cmd /c ping localhost -n " & iSeconds,0,True
End Sub
</script>
<body>
<h1>Simple HTA</h1>
<span id="dataarea"></span>
</body>
</html>
For the WScript.Echo, you can use MsgBox, however, there is no equivalent for the WScript.Sleep.
You could do it using a loop, that's working but it's resource intensive. You could also create a VBScript file on the fly where you include the WScript.Sleep command and run it via the HTA but there is an easier, faster and quite efficient solution.
So, here is an option that I used several times which did the trick for me.
In the following example, the sbWait sub is run a command line to do a ping to the localhost IP address for the number of times of your choice. Because each ping request is done every second, you just have to mention using the iSeconds variable the number of time you want to do it.
Enjoy.
<html>
<head>
<title>Simple HTA</title>
<HTA:APPLICATION
ID="oSimpleHTA"
APPLICATIONNAME="SimpleHTA"
>
</head>
<script Language="VBScript">
Sub Window_Onload
dataarea.innerhtml = "<p>This is a simple HTA</p>"
dataarea.innerhtml = "<p>Let's wait for 5 seconds</p>"
sbWait(5)
dataarea.innerhtml = "<p>Done.</p>"
End Sub
Sub sbWait(iSeconds)
Dim oShell : Set oShell = CreateObject("WScript.Shell")
oShell.run "cmd /c ping localhost -n " & iSeconds,0,True
End Sub
</script>
<body>
<h1>Simple HTA</h1>
<span id="dataarea"></span>
</body>
</html>
Subscribe to:
Posts (Atom)