如何解决在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 举报,一经查实,本站将立刻删除。