Почему функция PowerShell не может вернуть объект MessageQueue?

Я написал следующие варианты функции для возврата объекта 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" ведет журнал, чтобы доказать, что значение, записываемое в конвейер, не равно нулю, но функция не возвращает никакого значения.

Как это может быть? Это ошибка PowerShell?

Спасибо заранее.


person Neil Barnwell    schedule 11.04.2013    source источник
comment
3 и 3а точно не подойдут. Write-Output выводит объект на экран и ничего не возвращает. 1 или 2 должны работать, но я не могу проверить их самостоятельно, потому что у меня не установлена ​​очередь сообщений.   -  person Stanley De Boer    schedule 11.04.2013
comment
Извини, приятель, мне кажется, ты путаешь его с Write-Host. Write-Output отправляет указанные объекты следующей команде в конвейере. Если команда является последней командой в конвейере, объекты отображаются в консоли. Взято из technet.microsoft.com/en-us/library/hh849921.aspx< /а>   -  person Neil Barnwell    schedule 12.04.2013
comment
Каждый день я узнаю что-то новое. Спасибо   -  person Stanley De Boer    schedule 12.04.2013
comment
Без проблем. Причина, по которой Write-Output делает то же самое, что и Write-Host, заключается в том, что он берет элементы из конвейера и записывает их в конвейер. В PowerShell, когда элементы выпадают из конца конвейера, они записываются в консоль. По сути, в конце есть что-то вроде неявного Write-Host. Это может варьироваться в зависимости от реализации хоста, но OOTB ведет себя именно так.   -  person Neil Barnwell    schedule 12.04.2013
comment
Итак, если у вас была Write-Output в качестве последней команды в конвейере, вы можете оставить ее, и это не будет иметь никакого значения.   -  person Neil Barnwell    schedule 12.04.2013


Ответы (1)


Я идиот. Это не баг, но интересно. Поскольку System.Messaging.MessageQueue реализует System.Collections.IEnumerable путем перечисления своих сообщений, поведение, которое я наблюдал, заключалось в том, что PowerShell фактически считывал сообщения из вновь созданных очередей и помещал их в конвейер, а не сами объекты очереди. Конечно, поскольку очереди были новыми, они были пусты, поэтому по конвейеру ничего не передавалось.

Я только что провел большую часть дня и несколько часов этим вечером, работая над этим. Я не горжусь собой.

person Neil Barnwell    schedule 11.04.2013