我编写了以下函数的变体来返回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”版本具有日志记录,以证明它写入管道的值 not null ,但没有从函数返回任何值。
这怎么可能?这是PowerShell的错误吗?
非常感谢提前。
答案 0 :(得分:2)
System.Messaging.MessageQueue
通过枚举它的消息来实现System.Collections.IEnumerable
,所以我看到的行为是PowerShell实际上是从新创建的队列中读取消息并将它们放入管道而不是队列对象本身。当然因为队列是新的,所以它们是空的,所以没有任何东西传递到管道上。
我今天下午的大部分时间和今晚的工作时间都花了很多时间。我并不以自己为荣。