Search code examples
powershellmsmq

The number of messages on an MSMQ via Powershell


I'd like to provide a queuepath and get the number of messages thereupon. Any advice on how this could be done?


Solution

  • 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.