Индекс массива от первого до второго последнего в PowerShell

Как я могу получить диапазон элементов массива от первого до второго последнего?

Например,

$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++), но я искал ярлык в квадратных скобках.

Ответ 1

Вам просто нужно вычислить конечный индекс, например:

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

Не забудьте проверить, что на самом деле у вас на самом деле есть более двух записей в вашем массиве, иначе вы обнаружите, что в результате получаете дубликаты.

Примером такого дубликата может быть:

@(1)[0..-1]

Что из массива одного 1 дает следующий вывод

1 
1

Ответ 2

Как уже упоминалось ранее, лучшее решение здесь: $array[0..($array.length - 2)]

Проблема, с которой вы столкнулись с $array[0..-2], может быть объяснена природой выражения "0..-2" и оператора диапазона ".." в PowerShell. Если вы попытаетесь оценить только эту часть "0..-2" в PowerShell, вы увидите, что результатом будет массив чисел от 0 до -2.

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

И когда вы пытаетесь сделать $array[0..-2] в PowerShell, это так же, как если бы вы делали $array[0,-1,-2]. Вот почему вы получаете результаты как 1, 5, 4 вместо 1, 2, 3, 4.

Сначала это может показаться нелогичным, особенно если у вас есть некоторый опыт работы с Python или Ruby, но вы должны принять это во внимание при использовании PowerShell.

Ответ 3

Может быть ситуация, когда вы обрабатываете список, но вы не знаете длины. У объекта выбора есть параметр -skiplast.

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

1
2
3