2016-11-17 55 views
2

我確信有一個有效的原因,爲什麼發生這種情況,但我不知道它是什麼。我有以下代碼使用OutVariable創建ArrayList

$Deleted = $Items[0].ParentNode.RemoveChild($Items[0]) 
Write-Output $Deleted 

如果我打電話使用

Do-Something -OutVariable Test 

我得到的屏幕上,由可變輸出如預期該代碼,但變量是ArraryList與單個元素類型爲XmlElement

如果相反,我跑

$Test = Do-Something 

我沒有得到屏幕上的輸出,符合市場預期,返回的輸出類型的單個對象XmlElement

爲什麼OutVariable返回ArrayList,而不是返回單個項目的函數返回?

感謝

回答

3

由於v5.1.14393.206的(Windows)中/ V6.0.0-alpha.15(核心):

  • PowerShell的意外確實解開一個命令的對象輸出與-OutVariable即:即使命令只輸出一個對象,該對象意外存儲爲陣列(數組列表)將其名稱傳遞給通用參數-OutVariable參數(或其別名,-ov)的目標變量中。

  • 另外,類型存儲在目標變量的值始終是[System.Collections.ArrayList],陣列列表,這是不一致與由定期分配,捕獲多對象輸出在一個變量,它結果爲System.Object[],a 常規 array

我提交了一個問題here;截至記者發稿,它看起來像這樣將(在V6大概)固定,即使它是一個打破變化。

這裏的一個簡明測試演示該問題:

$null = Get-Date -OutVariable ov; $ov.GetType().FullName 

如上面列出的版本,這個輸出:

System.Collections.ArrayList 

即使輸出是(在概念上)僅一個單個[datetime][System.DateTime])實例。

將此與常規作業對比:$v = Get-Date; $v.GetType().FullName產量System.DateTime


解決方法是包裝在子表達式運算符($(...)),它給你相同的輸出經由規則輸出(成功)流輸出變量參考:

  • 展開單個元素集合(僅輸出元素本身)
  • 多元素集合返回爲System.Object[]數組。
# Note the $(...) around $ov 
> $null = Get-Date -OutVariable ov; $($ov).GetType().FullName 
System.DateTime # 1-element System.Collections.ArrayList unwrapped 

當然,你也可以使用$ov[0]如果你只指望一個單一的輸出對象。

的演示,該解決方法是用多元件輸出太有效:

> $null = Get-ChildItem/-OutVariable ov; $($ov).GetType().FullName 
System.Object[] # multi-element System.Collections.ArrayList converted to array