2012-12-23 58 views
17

任何人都可以解釋細節嗎?如果我創建使用PSObject,Hashtable和PSCustomObject之間的區別

$var = [PSObject]@{a=1;b=2;c=3} 

一個對象,然後我期待利用其getType()型Powershell的告訴我型Hashtable的它。 使用gm檢查對象時,很明顯已經創建了一個散列表,因爲它有一個鍵和一個values屬性。那麼「正常」哈希表有什麼區別?

另外,使用PSCustomObject有什麼優勢?當使用像這樣

$var = [PSCustomObject]@{a=1;b=2;c=3} 

創建一個給我的唯一可見的區別是PSCustomObject的不同數據類型。而不是鍵和值屬性,使用gm進行的檢查顯示,現在每個鍵都已添加爲NoteProperty對象。但我有什麼優勢?我可以通過使用它的鍵來訪問我的值,就像在散列表中一樣。我可以在PSCustomObject中存儲更多然後簡單的鍵值對(例如鍵對象對),正如在散列表中一樣。那麼優勢是什麼?有什麼重要的區別?

回答

1
+1

好,表演 - 好吧。但是,這一切?此外,性能是親哈希表。那麼PSCustomObject存在什麼權利?而默認的顯示選項,真的嗎?我們通常在處理數據 - 沒有人希望每天都展示這些東西。現在,當我需要顯示一些數據時,我仍然可以建立一個小循環並使用標準格式化器。似乎不足以證明我有一個新的數據類型。 – masi

+2

第一個鏈接中的文章沒有提到psobject vs pscustomobject的速度。相反,它強調了O(m * n)和O(m * ln n)算法之間的差異。 – JJJ

+4

「總是引用重要鏈接中最相關的部分,以防目標站點無法訪問或永久脫機。」 - http://stackoverflow.com/help/how-to-answer – Pete

10

一個優點,我認爲對於psobject是,你可以使用它創建自定義方法。 例如

$o=New-Object PSObject -Property @{ 
    "value"=9 
} 
Add-Member -MemberType ScriptMethod -Name "Sqrt" -Value { 
    echo "the square root of $($this.value) is $([Math]::Round([Math]::Sqrt($this.value),2))" 
} -inputObject $o 

$o.Sqrt() 

你可以用它來控制psobject屬性的排列順序(見PSObject sorting

+0

請注意,您可以同時使用PSObject或PSCustomObject。 –

20

一個場景[PSCustomObject]是用來代替HashTable是當你需要他們的集合。以下是說明如何處理它們的區別是:

$Hash = 1..10 | %{ @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} } 
$Custom = 1..10 | %{[PSCustomObject] @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} } 

$Hash | Format-Table -AutoSize 
$Custom | Format-Table -AutoSize 

$Hash | Export-Csv .\Hash.csv -NoTypeInformation 
$Custom | Export-Csv .\CustomObject.csv -NoTypeInformation 

Format-Table將導致$Hash如下:

Name Value 
---- ----- 
Name Object 1 
Squared 1 
Index 1 
Name Object 2 
Squared 4 
Index 2 
Name Object 3 
Squared 9 
... 

$CustomObject如下:

Name  Index Squared 
----  ----- ------- 
Object 1  1  1 
Object 2  2  4 
Object 3  3  9 
Object 4  4  16 
Object 5  5  25 
... 

同與Export-Csv發生的事情,因此使用[PSCustomObject]而不僅僅是簡單的原因HashTable

13

說我想創建一個文件夾。如果我使用一個PSObject你可以告訴它是錯的 看着它

PS > [PSObject] @{Path='foo'; Type='directory'} 

Name       Value 
----       ----- 
Path       foo 
Type       directory 

然而PSCustomObject看起來是正確的

PS > [PSCustomObject] @{Path='foo'; Type='directory'} 

Path         Type 
----         ---- 
foo          directory 

我可以再管對象

[PSCustomObject] @{Path='foo'; Type='directory'} | New-Item 
+0

提高投票率,因爲這正是我正在尋找的答案。 –