我在Powershell中有一个函数,它用字典填充列表。
Function Process-XML-Audit-File-To-Controls-List($nodelist){
#Keep an array list to track the different controls
$control_list = New-Object System.Collections.ArrayList
foreach($var in $nodelist)
{
$lines = [string]($var.InnerText) -split '[\r\n]'
$control_dict = @{}
foreach($line in $lines){
$line_split = $line.Trim() -split ':',2
if($line_split.Length -eq 2){
$control_dict.Add($line_split[0],$line_split[1])
}
}
$control_list.Add($control_dict)
}
return $control_list
}
不是接收只返回Hashtables的ArrayList,而是返回一个包含Int32和Hashtable的列表,其中每个哈希表元素都有一个Int32:
True True Int32 System.ValueType
True True Int32 System.ValueType
True True Int32 System.ValueType
True True Hashtable System.Object
True True Hashtable System.Object
True True Hashtable System.Object
我不确定为什么我的ArrayList中有这些整数。
答案 0 :(得分:3)
这里的问题是ArrayList.Add()
返回添加新项目的索引。当您return $control_list
时,表示索引位置的整数已经写入管道
使用[void]
添加方法调用以删除Add()
的输出:
[void]$control_list.Add($control_dict)
或管道到Out-Null
:
$control_list.Add($control_dict) | Out-Null
答案 1 :(得分:1)
为什么不直接声明一个空数组然后使用“+ =”而不是Add()?
$control_list = @()
$hash = [PSCustomObject]@{}
$control_list += $hash
另外,为什么要将节点解析为文本?
答案 2 :(得分:0)
System.Collections.ArrayList::Add()
添加了对象,而不是键值对,因此当您执行此操作$control_dict.Add($line_split[0],$line_split[1])
时,您将添加两个对象,一个整数和一个哈希表。如果要将整数用作键,则应使用哈希表属性赋值,如下所示:
$control_dict.($line_split[0]) = $line_split[1]
你需要将$line_split[0]
包装成括号,以便添加正确的密钥,否则查询的值将是$control_dict.$line_split
,这是有效的,因为哈希表接受对象作为键,而null作为从不已分配,然后从空值中获取[0]
将为您提供异常。