Powershell在填充arrayList时添加了Integers

时间:2015-07-13 10:05:26

标签: powershell arraylist

我在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中有这些整数。

3 个答案:

答案 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]将为您提供异常。