PowerShell中从第一个到倒数第二个的数组索引

24

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

例如,

$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++),但我正在寻找方括号的快捷方式。


6
你可以使用 $array[0..($array.length-2)] 来实现相同的功能。 - Robert Westerlund
罗伯特的建议是我所知道的最好的方法,但很遗憾。我也希望 $array[0..-2] 能按照你预期的方式运作。但实际上,它会从后往前索引 0 -> [len-1] -> [len - 2]。我真的不明白这有什么用处。 - Keith Hill
@robert.westerlund 你应该把你的评论添加为答案,这样我们就可以关闭这个问题 :) - Frode F.
4个回答

28

你只需要计算结束索引,像这样:

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

请务必先检查您的数组中是否实际有两个以上的条目,否则您将发现结果中出现了重复。

这样一个重复的例子是:

@(1)[0..-1]

从一个只包含单个数字1的数组中,会得到以下输出:

1 
1

1
谢谢你!不过很遗憾,虽然可以使用负索引,但在范围内并没有实现;这是不自然和令人沮丧的。 - AER
在Ruby中,[1,2,3,4][1..-1]的结果是[2,3,4]。在Powershell中,@(1,2,3,4)[1..-1]的结果是2,1,4。Powershell中关于-1的问题不仅仅涉及到重复。 - TNT

10

可能会有这样的情况,你正在处理一个列表,但是不知道它的长度。 Select-object 有一个 -skiplast 参数。

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

1
2
3

6
如前所述,这里最好的解决方案是:$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时需要考虑这一点。

2

Robert Westerlund的回答非常好。 我刚看到这个问题的答案在关于数组的所有你想知道的内容页面上,我想试一下。 我喜欢它,因为它似乎描述了目标是什么,以上限的前一个结束。

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

我使用了你最初尝试的变体来卸载除最新版本之外的所有版本,这个方法非常简短,但不是完美的,因为如果有超过9个项目,它仍然只返回8个,但是你可以使用更大的负数。

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

1
我完全不知道.GetUpperBound(0)存在。.GetUpperBound(0) - 1.Count - 2直观得多,即使它更长。 - Vopel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接