2016-03-01 33 views
1

問題語句 t:Count和Keys屬性可以通過散列值重載並且不返回它們的期望值。Powershell哈希表計數和鍵屬性獲取過載

我的PowerShell代碼是這樣的:

$hash = @{} 
$hash.one = "Number 1" 
$hash.two = "Number 2" 

"Count is [{0}]" -f $hash.Count 
$hash.Count = "Count's Hash Value" 
"Count is now [{0}]" -f $hash.Count 

我的輸出是這樣的:

Count is [2] 
Count is now [Count's Hash Value] 

Count屬性超載!這個問題可能會導致用戶非常難以診斷錯誤。如果我困惑了很長時間。同樣的問題適用於「鑰匙」或實際上任何財產。

你有什麼想法避免這個最佳做法?也許一個不同的System.Collection?或在所有Keys前加上一個字符,例如:

$key = ":" + $key 

但是,它不是很優雅。即使現在我知道這個問題,我懷疑我會忘記並再次犯同樣的錯誤。

我個人認爲這是Powershell語言定義的問題。這個。符號(如在$ hash.MyKey中)不應該被允許用於檢索散列值,僅用於檢索屬性值。只是一個想法。 :-)

感謝您的幫助。

回答

6

可以直接調用屬性get訪問,而不是訪問屬性或使用Select-Object -ExpandProperty

@{Count=123}.get_Count() 
@{Count=123}|Select-Object -ExpandProperty Count 

在PowerShell中V3 +,你也可以使用PSBasePSObject自動屬性:

@{Count=123;PSBase=$null}.PSBase.Count 
@{Count=123;PSObject=$null}.PSObject.Properties['Count'].Value 
+0

感謝。我試了你的答案。他們都工作。我認爲我最喜歡get_Count()和get_Keys()。語法較短。與Powershell的這種特質有潛在的危險。我可以想象客戶擁有多年來一直未被發現的間歇性錯誤。 – Kiwi