【问题标题】:How to create and populate an array in Powershell based on a dynamic variable?如何基于动态变量在 Powershell 中创建和填充数组?
【发布时间】:2015-03-30 07:10:39
【问题描述】:

我已经为此苦苦挣扎了几天,但我不知道如何克服它。我需要执行以下操作:

导入具有以下值的用户 csv:

ID、名称、地区

基于区域值创建一个数组,然后我可以使用该数组来填充该区域的 ID 和名称,即。

Array_SEA

AA_SCOM,亚当·安德鲁斯,东南亚

Array_OAK

BB_SCOM,鲍勃·巴克,OAK

这是我现在得到的代码:

$list2 = ipcsv .\TSE_Contact_List.csv | sort-object BU

$arraylist =@()

foreach ($vitem in $list2)
{
$arraylist += New-Object PsObject -Property @{'Array' = "Array_" + $vitem.bu}
}
foreach ($varray in $arraylist)
{
$arr = new-variable -Name $varray
$arr.value += $varray.array
$arr
}

对于具有重复区域的记录,这会产生以下错误: 新变量:名称为“@{Array=Array_SCA}”的变量已存在。

当它尝试添加值时,我也会得到以下信息: 在此对象上找不到属性“值”;确保它存在并且是可设置的。

我知道我实际上并没有在第二部分创建数组,但我不确定如何在不将变量声明转换为数组名称的情况下将变量的输出传递给数组名称,如果这有意义的话.

我用哈希表尝试了以下方法,它越来越接近:

$list2 = ipcsv .\TSE_Contact_List.csv | sort-object BU

$arraylist =@{}

foreach ($vitem in $list2){$arraylist[$vitem.bu] = @()}

foreach ($record in $list2)
{
$arraylist[$vitem.bu] += ($record.SCOMID,$record.Name,$record.BU)
Write-host "Array: "
$arraylist[$vitem.bu]
write-host ""
}

此输出显示没有错误,但它只是不断显示列表每次迭代的所有记录的添加字段,因此我认为它实际上并未将每个唯一 BU 分配给数组名称。

【问题讨论】:

  • 有什么理由不使用 Group-Object,并按 Region 分组?

标签: arrays powershell hashtable dynamic-arrays


【解决方案1】:

我喜欢哈希表方法,但我会对其进行微调。试试:

$list2 = ipcsv .\TSE_Contact_List.csv | sort-object BU

$arraylist = @{}

foreach ($vitem in $list2){
    if($arraylist.ContainsKey($vitem.BU)) {
        #Array exists, add item
        $arraylist[($vitem.BU)] += $vitem
    } else {
        #Array not found, creating it
        $arraylist[($vitem.BU)] = @($vitem)    
    }
}

#TEST: List arrays and number of entries
$arraylist.GetEnumerator() | % {
    "Array '$($_.Key)' has $($_.Value.Count) items"
}

你也可以使用Group-Object 喜欢:

$list2 = ipcsv .\TSE_Contact_List.csv | Group-Object BU

#TEST: List groups(regions) and number of entries
$list2 | % {
    "Region '$($_.Name)' has $(@($_.Group).Count) items"
}

【讨论】:

  • 为什么不两者兼而有之? $list2 = ipcsv .\TSE_Contact_List.csv | Group BU -AsHashTable -AsString #TEST:列出组(区域)和条目数 $list2.getenumerator() | % { $_.key "-" $_.value | out-string } 这个方法很棒,让我有一个很好的开始,谢谢!现在我只需要弄清楚如何将值拉回并将它们通过管道传输到另一个 cmdlet。
猜你喜欢
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 2021-10-06
  • 2021-09-28
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2019-06-20
相关资源
最近更新 更多