【问题标题】:Array index from first to second last in PowerShellPowerShell中从第一个到倒数第二个的数组索引
【发布时间】:2022-03-23 03:00:04
【问题描述】:

如何获取数组元素从第一个到倒数第二个的范围?

例如,

$array = 1,2,3,4,5
$array[0] - will give me the first (1)
$array[-2] - will give me the second last (4)
$array[0..2] - will give me first to third (1,2,3)
$array[0..-2] - I'm expecting to get first to second last (1,2,3,4) but I get 1,5,4 ???

我知道我可以做长手并转到for($x=0;$x -lt $array.count;$x++),但我正在寻找方括号快捷方式。

【问题讨论】:

  • 你可以这样做$array[0..($array.length-2)]
  • 不幸的是,罗伯特的建议是我所知道的最好的方法。我也希望 $array[0..-2] 能够按照您的预期行事。但是不,它向后索引 0 -> [len-1] -> [len-2]。我真的不明白这有什么用。
  • @robert.westerlund 您应该添加您的评论作为答案,以便我们可以关闭此问题:)

标签: arrays powershell


【解决方案1】:

您只需要计算结束索引,如下所示:

$array[0..($array.length - 2)]

请记住首先检查您的数组中是否确实有两个以上的条目,否则您会发现自己在结果中得到了重复项。

这种重复的一个例子是:

@(1)[0..-1]

其中,从单个 1 的数组中得到以下输出

1 
1

【讨论】:

  • 谢谢!遗憾的是,您可以使用负索引,但它不是在范围内实现的;这是不自然和令人沮丧的。
  • [1,2,3,4][1..-1] 在 Ruby 中的结果是 [2,3,4]。 Powershell 中的@(1,2,3,4)[1..-1] 结果为2,1,4。 Powershell 中-1 的问题不仅仅是重复。
【解决方案2】:

如前所述,这里的最佳解决方案是: $array[0..($array.length - 2)]

您遇到$array[0..-2] 的问题可以用PowerShell 中"0..-2" 表达式和范围运算符".." 的性质来解释。如果您尝试在 PowerShell 中仅评估这部分 "0..-2",您将看到结果将是一个从 0 到 -2 的数字数组。

>> 0..-2
0
-1
-2

当您尝试在 PowerShell 中执行 $array[0..-2] 时,与执行 $array[0,-1,-2] 相同。这就是为什么你会得到1, 5, 4 而不是1, 2, 3, 4 的结果。

一开始可能有点违反直觉,尤其是如果您有一些 Python 或 Ruby 背景,但在使用 PowerShell 时需要考虑到这一点。

【讨论】:

    【解决方案3】:

    可能存在您正在处理列表但不知道长度的情况。 Select-object 有一个 -skiplast 参数。

    (1,2,3,4,5 | select -skiplast 2)
    
    1
    2
    3
    

    【讨论】:

      【解决方案4】:

      Robert Westerlund 的回答非常好。 这个答案我刚刚在Everything you wanted to know about arrays 页面上看到并想尝试一下。 我喜欢它,因为它似乎准确地描述了目标是什么,在距离上限差一点的地方结束。

      $array[0..($array.GetUpperBound(0) - 1)]
      1
      2
      3
      4
      

      我使用您最初尝试的这种变体从 Get-InstalledModule 卸载除最新版本之外的所有版本。它确实很短,但并不完美,因为如果有超过 9 个项目,它仍然只返回 8 个,但是你可以输入一个更大的负数。

      $array[-9..-2]
      1
      2
      3
      4
      

      【讨论】:

        猜你喜欢
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多