作爲我的Powershell腳本的一部分,我需要實質上實現廣度優先搜索。所以,我需要隊列和計算System.Collections.Queue是一樣好任何其他隊列。但是,當我將對象從隊列中取出時,Powershell會失去跟蹤已添加到對象中的任何屬性。在通過System.Collections.Queue傳遞對象時丟失類型信息
這是怎麼回事?我如何訪問我的財產?
此示例說明問題:
$object = new-object object
add-member -membertype noteproperty -name AnInteger -value 2 -inputobject $object
$queue = new-object system.collections.queue
$queue.enqueue($object)
$dequeued = $queue.dequeue()
# 1. True - both variables refer to the same object.
$object -eq $dequeued
# 2. True - using the original variable, can access the property.
$object.AnInteger -ne $null
# 3. False. Err, What?
$dequeued.AnInteger -ne $null
解決方案和更多的問題
,我發現我的錯誤:add-member
修改的PSObject
實例不會反對。它看起來像它創造了一個爲我包裝$object
之前添加屬性。所以,我需要創建一個PSObject
或將出隊結果投給PSObject
。
我還是不明白這裏發生的一切。 add-member
是否修改$object
來參考它創建的PSObject
?如果不是的話,Powershell運行時如何知道$object
實際上是PSObject
? $object.gettype().name
是Object
而不是PSCustomObject
。
添加成員只能直接修改PSObjects,因爲那些可以有類型擴展的成員。要修改常規對象,請使用-PassThru並獲取新對象。 '$ Object = Add-Member -input $ Object ... -PassThru'。這實際上會創建一個PSObject來包裝常規對象。新的PSObject對你來說基本上是透明的。 – JasonMArcher 2011-06-18 17:38:18