Write MSMQ Messages from PowerShell

This PowerShell script sends a message to an MSMQ. I did it this particular way because NServiceBus can consume messages sent like this.

[Reflection.Assembly]::LoadWithPartialName("System.Messaging");

$queueName = '.\Private$\your.queue.name';
$queue = new-object System.Messaging.MessageQueue $queueName;
$utf8 = new-object System.Text.UTF8Encoding;

$tran = new-object System.Messaging.MessageQueueTransaction;
$tran.Begin();

$msgContent = '<?xml version="1.0" ?>
   <Messages xmlns="your-xml-namespace">
        <IWebApplicationStartupCompleting>
        </IWebApplicationStartupCompleting>
    </Messages>';
$msgBytes = $utf8.GetBytes($msgContent);

$msgStream = new-object System.IO.MemoryStream;
$msgStream.Write($msgBytes, 0, $msgBytes.Length);

$msg = new-object System.Messaging.Message;
$msg.BodyStream = $msgStream;
$queue.Send($msg, $tran);

$tran.Commit();
This entry was posted in CodeMinder, MSMQ, PowerShell, Programming. Bookmark the permalink.
  • I also like to set the message label, so that anyone who looks in a message queue and sees the message will know what it is without having to open it. Simply add .Label = ‘your label’; after the .BodyStream line.

  • Excellent post, helped me avoid writing a console app which just dumped a simple message on the bus. Thanks.

    • Jason

      Glad to hear that, Antony – thanks for dropping me a note!

  • AaronD12

    Here it is cleaned up:

    [Reflection.Assembly]::LoadWithPartialName(“System.Messaging”);

    $queueName = ‘.Private$your.queue.name’;
    $queue = new-object System.Messaging.MessageQueue $queueName;
    $utf8 = new-object System.Text.UTF8Encoding;

    $tran = new-object System.Messaging.MessageQueueTransaction;
    $tran.Begin();

    $msgContent = ”;
    $msgBytes = $utf8.GetBytes($msgContent);

    $msgStream = new-object System.IO.MemoryStream;
    $msgStream.Write($msgBytes, 0, $msgBytes.Length);

    $msg = new-object System.Messaging.Message;
    $msg.BodyStream = $msgStream;
    $queue.Send($msg, $tran);

    $tran.Commit();

    • Thanks, AaronD12 – not sure when that got ugly. I cleaned it up in the original.