1

我编写了以下函数的变体来返回一个System.Messaging.MessageQueue对象:

set-strictmode -version latest
add-type -AssemblyName System.Messaging
$VerbosePreference = 'Continue'
$DebugPreference = 'Continue'

function Get-MsmqQueue1 {
    New-Object "Messaging.MessageQueue" -Args '.\private$\barneytest'
}

function Get-MsmqQueue2 {
    $q = New-Object "Messaging.MessageQueue" -Args '.\private$\barneytest'
    $q
}

function Get-MsmqQueue3 {
    $q = New-Object "Messaging.MessageQueue" -Args '.\private$\barneytest'
    Write-Output $q
}

function Get-MsmqQueue3a {
    $q = New-Object "Messaging.MessageQueue" -Args '.\private$\barneytest'
    if ($q) {
        Write-Debug "Successfully created $($q.QueueName)"
    } else {
        Write-Error "No queue object created"
    }
    Write-Output $q
}

$q = Get-MsmqQueue3a
$q
if ($q) {
    Write-Debug $q.QueueName
} else {
    Write-Error "No queue object returned"
}

它们都没有返回对象。它以某种方式被 PowerShell 吞并。请注意,“3a”版本具有日志记录以证明它写入管道的值不是 null,但函数没有返回任何值

怎么会这样?这是一个 PowerShell 错误吗?

提前谢谢了。

4

1 回答 1

2

我是个白痴。这不是一个错误,但它很有趣。因为System.Messaging.MessageQueue通过System.Collections.IEnumerable枚举它的消息来实现,所以我看到的行为是 PowerShell 实际上是从新创建的队列中读取消息并将它们放入管道而不是队列对象本身。当然,因为队列是新的,它们是空的,所以没有任何东西通过管道传递。

我今天下午的大部分时间和今晚的几个小时都在解决这个问题。我并不为自己感到骄傲。

于 2013-04-11T14:50:26.200 回答