The number of messages on an MSMQ via Powershell The number of messages on an MSMQ via Powershell powershell powershell

The number of messages on an MSMQ via Powershell


This will list all queues on a machine and the number of messages:

gwmi -class Win32_PerfRawData_MSMQ_MSMQQueue -computerName $computerName |    ft -prop Name, MessagesInQueue


PowerShell under Windows Server 2012/2012 R2 and Windows 8/8.1 has a bunch built-in Cmdlets that can be used by installing the Microsoft Message Queue (MSMQ) Server Core feature.

# Get all message queuesGet-MsmqQueue;# Get all the private message queues.# Display only the QueueName and MessageCount for each queue.Get-MsmqQueue -QueueType Private | Format-Table -Property QueueName,MessageCount;

There is a number of other Cmdlets that can be used for queue management and message creation. i.e.

  • New-MsmqQueue
  • Remove-MsmqQueue
  • Send-MsmqQueue
  • Receive-MsmqQueue
  • Get-MsmqQueueManager

For the full list of MSMQ Cmdlet help see MSMQ Cmdlets in Windows PowerShell, or Get-Command -Module MSMQ if you already have the feature installed.


So, I saw this: What can I do with C# and Powershell? and went here:http://jopinblog.wordpress.com/2008/03/12/counting-messages-in-an-msmq-messagequeue-from-c/

And made this

# Add the .NET assembly MSMQ to the environment.[Reflection.Assembly]::LoadWithPartialName("System.Messaging")# Create a new QueueSizer .NET class help to warp MSMQ calls.$qsource = @"public class QueueSizer    {        public static System.Messaging.Message PeekWithoutTimeout(System.Messaging.MessageQueue q, System.Messaging.Cursor cursor, System.Messaging.PeekAction action)        {            System.Messaging.Message ret = null;            try            {                // Peek at the queue, but timeout in one clock tick.                ret = q.Peek(new System.TimeSpan(1), cursor, action);            }            catch (System.Messaging.MessageQueueException mqe)            {                // Trap MSMQ exceptions but only ones relating to timeout. Bubble up any other MSMQ exceptions.                if (!mqe.Message.ToLower().Contains("timeout"))                {                    throw;                }            }            return ret;        }        // Main message counting method.        public static int GetMessageCount(string queuepath)        {            // Get a specific MSMQ queue by name.            System.Messaging.MessageQueue q = new System.Messaging.MessageQueue(queuepath);            int count = 0;            // Create a cursor to store the current position in the queue.            System.Messaging.Cursor cursor = q.CreateCursor();            // Have quick peak at the queue.            System.Messaging.Message m = PeekWithoutTimeout(q, cursor, System.Messaging.PeekAction.Current);            if (m != null)            {                count = 1;                // Keep on iterating through the queue and keep count of the number of messages that are found.                while ((m = PeekWithoutTimeout(q, cursor, System.Messaging.PeekAction.Next)) != null)                {                    count++;                }            }            // Return the tally.            return count;        }    }"@# Add the new QueueSizer class helper to the environment.Add-Type -TypeDefinition $qsource -ReferencedAssemblies C:\Windows\assembly\GAC_MSIL\System.Messaging\2.0.0.0__b03f5f7f11d50a3a\System.Messaging.dll# Call the helper and get the message count.[QueueSizer]::GetMessageCount('mymachine\private$\myqueue');

And it worked.