我正在尝试编写一个脚本来监视服务器上的 MSMQ。我发现了这个,它就像一个魅力,但我还需要知道到达的时间。
使用 Get-Member cmdlet 时,我会得到一个属性列表,但似乎没有一个能满足我的需要。
有谁知道如何获得到达时间?
/G
我正在尝试编写一个脚本来监视服务器上的 MSMQ。我发现了这个,它就像一个魅力,但我还需要知道到达的时间。
使用 Get-Member cmdlet 时,我会得到一个属性列表,但似乎没有一个能满足我的需要。
有谁知道如何获得到达时间?
/G
终于想通了。
[String]$cName = $Env:COMPUTERNAME
[Reflection.Assembly]::LoadWithPartialName("System.Messaging") | out-null
[System.Messaging.MessageQueue[]]$queues = [System.Messaging.MessageQueue]::GetPrivateQueuesByMachine($cName.ToLower())
Foreach ($queue in $queues) {
$queue.MessageReadPropertyFilter.SetAll()
try {
[System.Messaging.Message]$message = $queue.Peek(10)
Write-Host $queue.QueueName $message.ArrivedTime
}
catch {
#Write-Host "Timeout"
}
}
诀窍是设置 MessageReadPropertyFilter。可以单独设置每个属性,但现在就可以了。
$qname = "<YourQueueNameHere>"
[Reflection.Assembly]::LoadWithPartialName("System.Messaging") | out-null
$q = new-object System.Messaging.MessageQueue($qname)
$msgs = $q.GetAllMessages()
foreach ( $msg in $msgs )
{
Write-Host $msg.ArrivedTime
}
这对我有用。就我而言,脚本会计算过去一小时内收到了多少条消息。
$QueueArray = "MyQueue1.ERRORS", "MyQueue2.ERRORS";
foreach ($queue in $QueueArray)
{
# Create each MSMQ object
[System.Reflection.Assembly]::LoadWithPartialName("System.Messaging") | Out-Null
$MessageQueue = New-Object System.Messaging.MessageQueue (".\private$\" + $queue)
# Get the amount of the messages in the queue for the past hour.
$MessageQueue.MessageReadPropertyFilter.SetAll()
$PastHour = (Get-Date).AddHours(-1)
$countFailedMessages = 0
foreach ($message in $MessageQueue )
{
if ($PastHour -lt $message.ArrivedTime)
{
#Write-Host $message.ArrivedTime
$countFailedMessages++
#Write-Host $countFailedMessages
}
}
Write-Host $queue `t $countFailedMessages "failed messages for the past hour"
}