在Powershell中使用哈希表

在Powershell中使用哈希表,powershell,hashtable,Powershell,Hashtable,我在powershell中对多个条目使用哈希表,我的HastTable工作正常,但对于单个条目,它会抛出错误,因为没有选择它想要的值。假设我在排队 Aman;Indore;789858585;23 Raman;Delhi;785458545;35 对于这两个条目,当我发出命令(例如userinput.name[0]时,我的哈希表工作正常,因此它将选择Aman作为值,然后选择user.input.name[1]作为值 但相同的代码只包含一个 Aman;Indore;789858585;23

我在powershell中对多个条目使用哈希表,我的HastTable工作正常,但对于单个条目,它会抛出错误,因为没有选择它想要的值。假设我在排队

Aman;Indore;789858585;23
Raman;Delhi;785458545;35
对于这两个条目,当我发出命令(例如
userinput.name[0]
时,我的哈希表工作正常,因此它将选择
Aman
作为值,然后选择
user.input.name[1]
作为值

但相同的代码只包含一个

Aman;Indore;789858585;23 

当我给出
userinput.name[0]
时,它会选择
A
。它选择的是一个人的第一个字母,而不是全名。

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

基本上,如果尝试访问数组中的命名属性,如果该属性在数组对象本身上不存在,则PowerShell将在数组中的所有项上查找该属性,并在新数组中返回这些值

例如:

PS>$csv=@”
阿曼;印多尔;7898585;23
拉曼;德里;78545;35
"@
PS>$data=$csv|convertfromCSV-分隔符““-标题@(“名称”、“位置”、“移动”、“年龄”);
PS>$data
姓名位置移动时代
----  -------- ------    ---
阿曼印多尔7898585 23
拉曼德里785458545 35
PS>$data.Name
阿曼
拉曼光谱
#注意:由于成员枚举,这将返回一个对象数组
PS>$data.Name.GetType().FullName
系统对象[]
PS>$data.Name[0]
阿曼
在您的情况下,
$data.Name
返回一个新数组,该数组包含
$data
中所有项目的
Name
属性的值,有效地
@(“Aman”,“Raman”)
。因此,当您使用
$data.Name[0]
时,您正在检索由成员枚举创建的数组中的第一个项,即
Aman
,世界上一切都很好

现在,问题是,如果成员枚举创建的数组中只有一个项,那么它将“展开”为第一个项的值:

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

PS> $data = $csv | ConvertFrom-Csv -Delimiter ";" -Header @("Name", "Location", "Mobile", "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]
相当于返回
A的
“Aman”[0]

若要解决此问题,而不是通过执行
$data.Name[0]
无意中使用成员枚举,如果结果可能因数组中的项目数而异,则可以使用以下方法之一:

PS>$data[0]。名称
阿曼
PS>@($data.Name)[0]
阿曼

在一般情况下,第一个选项可能更有效,但在第一个选项不起作用的某些情况下,第二个选项是一个有用的解决方法(例如,在处理函数/
where object
等的返回值时)。

请编辑问题并包含演示问题的内容。这听起来像是哈希表/数组访问中的不匹配,但如果没有代码,这只是猜测。不要在注释中添加代码,这些代码很难阅读,问题本身应该包含所有细节。这是否回答了您的问题,因此:
@($userinput.name)[0]
看起来不像哈希表。它看起来像一个CSV文本文件。您确定要处理哈希表吗?当您使用一行创建哈希表时,很可能是将其创建为字符串而不是数组。正如其他人所评论的,它看起来不像一个哈希表。更像是CSV格式或类似的格式。请添加更多代码,并向我们展示如何分配变量以及如何提取变量。这是否回答了您的问题?