【问题标题】:Powershell Hashtable Count and Keys Properties getting overloadedPowershell Hashtable Count 和 Keys 属性过载
【发布时间】:2016-06-13 12:26:37
【问题描述】:

问题陈述:Count 和 Keys 属性可能会被哈希值重载,并且不会返回它们的预期值。

我的 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?或在所有键前面加上一个字符,例如:

$key = ":" + $key 

但是,它不是很优雅。即使现在我知道了这个问题,我怀疑我会忘记并再次犯同样的错误。

我个人认为这是 Powershell 语言定义的问题。这 。表示法(如在 $hash.MyKey 中)不应被允许用于检索哈希值,仅用于检索属性值。只是一个想法。 :-)

感谢您的帮助。

【问题讨论】:

    标签: powershell count key hashtable


    【解决方案1】:

    您可以直接调用属性get访问器而不是访问属性或使用Select-Object -ExpandProperty

    @{Count=123}.get_Count()
    @{Count=123}|Select-Object -ExpandProperty Count # does not work on PowerShell Core
    

    在 PowerShell v3+ 中,您还可以使用 PSBasePSObject 自动属性:

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

    【讨论】:

    • 谢谢。我尝试了你的两个答案。他们都工作。我想我最喜欢 get_Count() 和 get_Keys() 。语法更短。 Powershell 的这种特性具有潜在的危险性。我可以想象客户有多年未被发现的间歇性错误。
    • @Kiwi:有关背景信息,请参阅this discussion on GitHub
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 2015-11-17
    • 2011-12-19
    • 1970-01-01
    • 2013-12-28
    • 2021-07-26
    相关资源
    最近更新 更多