2013-04-11 63 views
1

我寫了一個函數的以下變化返回一個System.Messaging.MessageQueue對象:爲什麼PowerShell函數不能返回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錯誤?

非常感謝提前。

+0

3和3a將無法正常工作。寫輸出將對象打印到屏幕上並不返回任何內容。 1或2應該都可以工作,但我無法自己測試,因爲我沒有安裝消息隊列 – 2013-04-11 19:42:22

+0

對不起,我相信你會用'Write-Host'來混淆它。 「Write-Output將指定的對象發送到管道中的下一個命令,如果該命令是管道中的最後一個命令,則這些對象將顯示在控制檯中。」取自http://technet.microsoft.com/en-us/library/hh849921.aspx – 2013-04-11 20:34:49

+0

我每天都會學到新東西。謝謝 – 2013-04-12 11:12:16

回答

2

我是個白癡。這不是一個錯誤,但它很有趣。因爲System.Messaging.MessageQueue通過枚舉它的消息來實現System.Collections.IEnumerable,所以我看到的行爲是PowerShell實際上是從新創建的隊列中讀取消息,並將它們放入管道而不是隊列對象本身。當然,因爲隊列是新的,所以它們是空的,所以沒有任何東西傳到管道中。

我剛剛在今天下午的大部分時間以及今天晚上的幾個小時裏工作。我不以自己爲榮。

相關問題