【发布时间】:2023-04-06 04:17:01
【问题描述】:
我正在尝试使用 PowerShell 从 MSMQ 消息队列中删除特定消息。我知道 PowerShell 4+ 中引入了几个用于管理 MSMQ 队列和消息的新 cmdlet,但据我所知,这些仍然无法帮助我实现删除特定消息的目标。
我想要实现的是一个连接到指定队列的简单脚本,然后遍历该队列中的每条消息,在消息正文中查找指定的搜索字符串,然后 MOVES 任何匹配的消息到同一服务器上的另一个队列。我可以很好地搜索消息,并且可以使用 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+) 'Move-MsmqMessage' cmdlet...
Move-MsmqMessage -DestinationQueue $d -InputObject $q -Message $msg
但我正在努力让它工作 - 我不清楚我是否可以将特定的消息对象传递给它以移动。谁能给我一个使用 PowerShell(任何版本)循环队列中的消息并使用此 Move-MsmqMessage cmdlet 移动特定消息的工作示例?
【问题讨论】:
-
您不能将消息移出队列。您只能使用原始内容创建新消息以发送到不同的队列,然后删除原始消息。可能听起来很迂腐,但 MSMQ 的概念是目标队列是消息的最终存放位置。有一个确认传递到队列的基本机制和超时。如果您可以移动消息,那么该机制必须以某种方式跟踪该活动(跨多台机器!)并每次通知原始发件人。
-
Move-MsmqMessage 仅通过使用子队列影响同一队列中的消息。一个队列可以分为许多子队列,但所有消息仍然有效地在同一个队列中。
-
感谢约翰,让我更清楚了
标签: powershell msmq