在阅读了 Windows PowerShell 博客上的 this helpful article 后,我意识到我可以“移出”数组的第一部分,但不知道如何在 PowerShell 中“移出”或将元素推送到数组的前面。

我正在创建一个哈希对象数组,首先将最后一个读取项推送到数组上。我想知道是否有更好的方法来实现这一点。

## Create a list of files for this collection, pushing item on top of all other items
if ($csvfiles[$collname]) {
    $csvfiles[$collname] = @{ repdate = $date; fileobj = $csv }, $csvfiles[$collname] | %{$_}
}
else {
    $csvfiles[$collname] = @{ repdate = $date; fileobj = $csv }
}

有几点需要注意:
  • 我需要用 foreach 循环 %{$_} 展开前一个数组元素,因为仅仅引用数组会创建一个嵌套的数组结构。我必须将所有元素都放在同一级别。
  • 我需要区分一个空数组和一个包含元素的数组。如果我尝试展开一个空数组,它会在数组末尾放置一个 $null 元素。

  • 想法?

    PS:空哈希元素产生 NULL 值的原因是 $null 在 PowerShell 中被视为标量。有关详细信息,请参阅 https://connect.microsoft.com/PowerShell/feedback/details/281908/foreach-should-not-execute-the-loop-body-for-a-scalar-value-of-null

    回答:

    看起来最好的解决方案是在必要时预先创建空数组,而不是围绕 $null 问题编写代码。这是使用 .NET ArrayList 和 native PoSh 数组的重写。
    if (!$csvfiles.ContainsKey($collname)) {
        $csvfiles[$collname] = [System.Collections.ArrayList]@()
    }
    $csvfiles[$collname].insert(0, @{ repdate = $repdate; fileobj = $csv })
    
    ## NATIVE POSH SOLUTION...
    if (!$csvfiles.ContainsKey($collname)) {
        $csvfiles[$collname] = @()
    }
    $csvfiles[$collname] = @{ repdate = $repdate; fileobj = $csv }, `
                           $csvfiles[$collname] | %{$_}
    

    最佳答案

    您可能希望改用 ArrayList 对象,因为它们支持在任意位置插入。例如:

    # C:\> $a = [System.Collections.ArrayList]@(1,2,3,4)
    # C:\> $a.insert(0,6)
    # C:\> $a
    6
    1
    2
    3
    4
    

    关于arrays - PowerShell 阵列未移位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13502193/

    10-11 22:28
    查看更多