Last part of a series of posts on working with IBM WebSphere MQ from Windows PowerShell
Over my last four posts, I’ve given an introduction to how to use Windows PowerShell to administer WebSphere MQ, using SupportPac MO74.
For my final post in this series, I want to look at some more advanced uses of PowerShell, focusing on things that cannot be done easily with runmqsc or WebSphere MQ Explorer.
The last four posts have covered the cmdlet basics : New-WMQ, Get-WMQ and Set-WMQ. Where things get interesting is in combining them through the use of the object pipeline.
Let’s start with some imaginary scenarios for a WMQ sys-admin. Simplistic, but they should suffice for purposes of demonstration.
“Some of the queues used by the sales team are getting a bit full. Can you increase the amount of space in them?”
To clarify:
“by the sales team” means queues with names beginning with “SALES.”
“a bit full” means queues that are ten messages away from their maximum message depth
“increase” means double the existing maximum message depth
With some use of the pipeline, we can do this in a single line which will check all queue managers on our system.
PS C:\> Get-WMQQueue | Where {$_.QueueType -eq "Local" -and $_.CurrentDepth -gt ($_.MaximumDepth - 10)}
| foreach {Set-WMQQueue $_ -MaximumDepth ($_.MaximumDepth * 2)}
The command gets all queues, then filters them so only queues with a current depth greater than ten less than their maximum depth go into the pipeline. Each of the objects in the pipeline is then passed to a Set-WMQQueue command to modify the maximum depth property - using the current maximum depth property to start with.
This means that each Set-WMQQueue command can be setting the max depth of each queue to a different value. The ForEach cmdlet allows for more sophisticated modifications than a static command like
Set-WMQQueue -MaximumDepth 100
“We’re starting to see errors with the channels on a queue manager. What has changed with them since last week, when they were working fine?
When you reach a known good point, you can save object definitions to CSV file:
PS C:\> Get-WMQChannel -QmgrName MyQm | Export-Csv mychans.csv
Then, at a later date when you need to see what has changed:
PS C:\> Compare-Object (Import-Csv mychans.csv) (Get-WMQChannel -QmgrName MyQm) -Property Name, ChannelType, ConnectionName, TransmissionQueueName, ...
This command is explicitly specifying the attributes to consider when making a comparison. It might be easier to use Get-Member -MemberType Properties to get all of them more easily.
“I need to verify my SSL configuration.”
To start with, why not check that your SSL key repository files are in the right place?
PS C:\> Get-WMQQueueManager | Select Name, @{e={ ( $_.SSLKeyRepository + ".kdb") | Test-Path };n='Key repository present'}, @{e={ ( $_.SSLKeyRepository + ".kdb" ) | Test-Path };n='Stash file present'}
Name Key repository present Stash file present
---- ---------------------- ------------------
NEW ... False False
qmgr1fish ... True True
TESTQM ... False False
TESTQM2 ... True True
PS C:\>
“We need to check our transmission queues.”
We can check that all of our channels have transmission queue name properties which refer to an actual local queue, which has Usage set to ‘Transmission Queue’, and is put enabled.
PS C:\> Get-WMQChannel -QmgrName qmgr1test | Where {$_.Name -notlike "SYSTEM.*" } | Select Name, TransmissionQueueName, @{e={ (Get-WMQQueue -qmgrname qmgr1test -Name ($_.TransmissionQueueName) | Where {$_.Usage -eq "Transmission" -and $_.InhibitPut -eq "Allowed"}) -ne $null }; n='Valid transmission queue'}
Name TransmissionQueueName Valid transmission queue
---- --------------------- ------------------------
broken nonexistent False
qmgr1test.qmgr2test xmit_queue True
PS C:\>
A command-line ‘Healthcheck’?
It should be possible to write such PowerShell commands that implement all of the functions in the WebSphere MQ Explorer ‘Tests’ plugin (introduced in v6.0.2.0).
These could be grouped together and saved into functions - making it easier to run them repeatedly as needed. The functions could include comparing the output with the output from previous known-good runs and/or emailing it to a sys-admin. The execution of these could even be scheduled to run regularly.
Over time, it should be possible to build up a toolbox of scripts that can thoroughly but quickly check all of your queue managers.
What’s next?
The aim of this series of posts was to demonstrate the benefits of using PowerShell over traditional runmqsc scripting.
For more examples, there is a “Cookbook for ‘PowerShell for WebSphere MQ’” - which contains dozens of worked examples for using PowerShell with your queue managers. Download the MO74 zip file and you will find the powershellcookbook.pdf included.
I hope that readers will be able to take this further and think of more ways to use PowerShell - I’ve set up a forum where more command examples can be shared. As I think of more examples (or try porting more tests from the WMQ Explorer ‘Tests’ plugin), I will post them there.
What do you think?
What do you think about this? Feedback on the SupportPac or the potential of PowerShell administration for WebSphere MQ, is very welcome. If you have any questions, I’d also be happy to try and answer them.

1 comment
Comments feed for this article
December 14, 2007 at 1:45 am
learning something new » Blog Archive » Explaining PowerShell for WebSphere MQ
[...] Looking for problems with your WebSphere MQ objects with PowerShell [...]