微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Powershell中使用哈希表

如何解决在Powershell中使用哈希表

我在Powershell中将哈希表用于多个条目,而我的hastable可以正常工作,但是对于单个条目,它通过不选择要使用的值而引发错误。假设我有一条线

Aman;Indore;789858585;23
Raman;Delhi;785458545;35

对于这两个条目,当我给命令例如userinput.name[0]时,我的哈希表工作正常,因此它将选择Aman作为值,然后选择user.input.name[1]然后选择{{1} }作为值。

但是一次输入相同的代码

Raman

当我给Aman;Indore;789858585;23 时,它正在捡起userinput.name[0]。阿曼的第一个字母而不是全名。

解决方法

您甚至可能没有意识到,但是您使用的是PowerShell 3.0中引入的称为Member Enumeration的PowerShell功能。

基本上,如果您尝试访问数组上的命名属性,如果该属性在数组对象本身上不存在,那么PowerShell将在数组中的所有项目上查找该属性,并以新的形式返回这些值而不是数组。

例如:

PS> $csv = @"
Aman;Indore;789858585;23
Raman;Delhi;785458545;35
"@

PS> $data = $csv | ConvertFrom-Csv -Delimiter ";" -Header @("Name","Location","Mobile","Age");

PS> $data
Name  Location Mobile    Age
----  -------- ------    ---
Aman  Indore   789858585 23
Raman Delhi    785458545 35

PS> $data.Name
Aman
Raman

# note this returns an array of objects thanks to member enumeration
PS> $data.Name.GetType().FullName
System.Object[]

PS> $data.Name[0]
Aman

在您的情况下,$data.Name返回一个新数组,其中包含Name中所有项目上的$data属性的值-实际上是@("Aman","Raman")。因此,当您使用$data.Name[0]时,您将检索由成员枚举创建的数组中的第一项-即Aman-全世界一切都很好...

现在,要注意的是,如果成员枚举创建的数组中只有一个项目,它将“展开”成为第一个项目的值:

PS> $csv = @"
Aman;Indore;789858585;23
"@

PS> $data = $csv | ConvertFrom-Csv -Delimiter ";" -Header @("Name","Age");

PS> $data
# Name  Location Mobile    Age
# ----  -------- ------    ---
# Aman  Indore   789858585 23

# note this returns a single string because the "member enumeration" array
# gets unrolled if there's only one item
PS> $data.Name.GetType().FullName
System.String

PS> $data.Name
# Aman

PS> $data.Name[0]
# A

在您的情况下,$data.Name[0]等同于返回"Aman"[0]的{​​{1}}。

要解决此问题,而不是通过进行A来无意使用成员枚举(结果可能根据数组中的项目数而有所不同),可以使用以下一种方法:

$data.Name[0]

在通常情况下,第一个选项的性能可能更高,但是在某些情况下第一个选项不起作用(例如,处理来自函数/ PS> $data[0].Name Aman PS> @($data.Name)[0] Aman 的返回值等)时,第二个选项是有用的解决方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。