One way to build simple message boxes in PowerShell is to “borrow” from .NET COM objects. Basically you initialize the object…(a.k.a. load the code for generating a messagebox), and then you create instances of the object which are the actual message boxes. These messagebox code may be familiar to anyone who has programmed in vbScript, or any of the Microsoft programming languages such as Visual Basic or C#. The boxes can look pretty good, even though the coding is a bit arcane.
To get started, initialize the messagebox object. You only need to do this once per session.
PS> $wshell=New-Object -comObject Wscript.Shell
Now you can make message boxes until the cows come home.
PS> $wshell.Popup(“Hi…This is a lovely messagebox”,0,”My Window Title”)
You can have multi-line boxes by including the newline (back-tick+’n’) to separate lines.
PS> $wshell.Popup(“Hi! A list of shipping addresses will appear in the next window.`n
If you need to edit the addresses then… `n
- Go back to BrightPearl`n
- Make the address changes.`n
- Run this program again.”,0,”Send To Warehouse”)
The Buttons
You can have a buttons which return an integer based on which button is pressed.
In PowerShell, the button combinations are designated by integers:
0: OK
1: OK, Cancel
2: Abort, Retry, Ignore
3: Yes, No, Cancel,
4: Yes, No,
5: Retry, Cancel
The parameters for showing a window are:
<messagetext>, <duration>, <window title>, <button integers>
PS> $wshell.Popup(“Hi…This is a lovely messagebox”,0,”My Window Title”,1)
The first parameter is the message that you want to appear in the box. This is a string.
The second parameter “duration”, is an integer that specifies how long you want the messagebox to stay open if there is no activity from the user. If you specify ‘0’, then the box stays open forever. Note that your script is completely paused when this is the case. If you use a positive integer, that is the length in seconds that the messagebox stays open.
The third parameter is a string that is the title of the box. This appears in the top of the window frame.
In the example above, the messagebox call specifies “1” for the OK and Cancel button combination. When the user clicks on a button the messagebox closes, and returns an integer, in this case, 1 for OK or 2 for Cancel. The integers are displayed on the PowerShell command line. (Technically, the integers are returned to the pipeline).
Note that these returned integers are have nothing to do with the integer used to determine which buttons are displayed. (Why do I have to remind myself of this?)
Button Return Values
OK | Cancel | Abort | Retry | Ignore | Yes | No |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
Instead of having the result go to the pipeline, you can store it in a variable for further use. Capture the result variable by assigning the message box to a variable.
PS> $result=$wshell.Popup(“Hi…This is a lovely messagebox”,0,”My Window Title”,1)
PS> $result
The Icons
Messageboxes can also have an icon. There are four to choose from, and each has a designated integer.
Stop | 16 |
Question | 32 |
Exclamation | 48 |
Information | 64 |
Now, here’s the arcane part. To display an icon, you take the icon’s numeric value and add it to the numeric value of the button numeric value. So, for example to place a Stop icon on our sample message box with OK and Cancel buttons we add 16 to 1. Its not like they couldn’t provide another parameter?
PS> $result=$wshell.Popup(“Hi…This is a lovely messagebox”,0,”My Window Title”,65)
Finally:
If you get an error message, when putting up a messagebox, like the one below… it means that you didn’t run the New-Object cmdlet one time in your PowerShell session, prior to making a call to put up a messagebox.
PS> $wshell=New-Object -comObject Wscript.Shell
Having run that once, you can create as many messageboxes as you need within that particular PowerShell session.
You cannot call a method on a null-valued expression. At line:1 char:1 + $result=$wshell.Popup("Hi…This is a lovely messagebox",0,"My Window Title",65) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull