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 に答える