如何使用PowerShell从MSMQ消息队列中删除特定消息

时间:2016-05-25 20:56:57

标签: powershell msmq

我尝试使用PowerShell从MSMQ邮件队列中删除特定邮件。我知道有几个新的cmdlet用于管理MSMQ队列&消息是在PowerShell 4+中引入的,但据我所知,这些消息仍然无法帮助我实现删除特定消息的目标。

我想要实现的是一个连接到指定队列的简单脚本,然后遍历该队列中的每个消息,在消息体中查找指定的搜索字符串,然后 MOVES < / strong>任何匹配的消息到同一服务器上的另一个队列。我有这个非常好的搜索消息,并可以使用Send方法复制任何匹配:

$source = new-object System.Messaging.MessageQueue($sourcequeuename)
$destination = new-object System.Messaging.MessageQueue($destinationqueuename)
$msgs = $source.GetAllMessages()
foreach ( $msg in $msgs )
{
    #Extra logic here - check message body for search string etc...
    $destination.Send($msg)
}

但是 - 一旦复制,我从源队列中删除原始邮件的唯一选择似乎是清除整个源队列,这将删除所有其他邮件,我不会这样做。我想做!

$source.Purge()

我以为我使用新的(PowerShell 4+)&#39; Move-MsmqMessage&#39;小命令...

Move-MsmqMessage -DestinationQueue $d -InputObject $q -Message $msg

但我努力让这个工作 - 我不清楚我是否可以传递特定的消息对象来移动。任何人都可以给我一个使用PowerShell(任何版本)来循环遍历队列中的消息并使用此Move-MsmqMessage cmdlet移动特定消息的工作示例吗?

3 个答案:

答案 0 :(得分:2)

未经测试,但您应该可以使用ReceiveById功能删除邮件:

{Swaps_snaptime=2016-04-26T07:00:00.000Z, Swaps_20Y=2036-04-29 0.004588, Swaps_15Y=2031-04-29}

答案 1 :(得分:0)

问题和答案不包含使用的完整脚本。这是我用来从队列中删除单个消息的完整脚本,一旦我知道消息的 ID。

 [System.Reflection.Assembly]::LoadWithPartialName("System.Messaging") 
 $queuePath = "FormatName:DIRECT=OS:MachineName\private$\NameOfQueue" 
 $queue = New-Object System.Messaging.MessageQueue $queuePath 
 $poisonMessageId = "d53df8ba-3b6a-418b-ab27-198655534253\39996" 
 $queue.ReceiveById($poisonMessageId) 

顺便说一句,找到消息 ID 很容易,顺便说一句。 在以下位置找到消息:
计算机管理 -> 服务和应用程序 -> 消息队列 -> 专用队列。
打开包含您要删除的消息的私人队列
选择“属性”,然后在“常规”选项卡中显示消息 ID。

答案 2 :(得分:0)

Jay Dubya 脚本的扩展版本,按模式删除

$StringToFind = "AMS1-COMET5"
$QueueName = "AMS1-COMET5"

[System.Reflection.Assembly]::LoadWithPartialName("System.Messaging")
$queuePath = "FormatName:DIRECT=OS:"+ [System.Net.Dns]::GetHostName() + "\private$\" + $QueueName
$queue = New-Object System.Messaging.MessageQueue $queuePath 
$SrcQueue = Get-MsmqQueue($QueueName)
$Messages = $SrcQueue | Receive-MsmqQueue -Peek -Count 10000000
$Messages |foreach {
    if ($_.Label -match $StringToFind) {
        $_.Label
        $queue.ReceiveById($_.Id) 
        }
}