Получить индекс текущего элемента в петле Powershell?
Учитывая список элементов в powershell, как мне найти индекс текущего элемента из цикла?
Например:
$letters = { 'A', 'B', 'C' }
$letters | % {
# Can I easily get the index of $_ here?
}
Цель всего этого заключается в том, что я хочу вывести коллекцию с помощью Format-Table и добавить начальный столбец с индексом текущего элемента. Таким образом, люди могут в интерактивном режиме выбрать элемент для выбора.
Ответы
Ответ 1
Не уверен, что это возможно с помощью "автоматической" переменной.
Вы всегда можете объявить один для себя и увеличивать его
$letters = { 'A', 'B', 'C' }
$letters | % {$counter = 0}{...;$counter++}
или используйте цикл for
вместо этого...
for ($counter=0; $counter -lt $letters.Length; $counter++){...}
Ответ 2
У .NET есть некоторые полезные методы утилиты для такого рода вещей в System.Array:
PS> $a = 'a','b','c'
PS> [array]::IndexOf($a, 'b')
1
PS> [array]::IndexOf($a, 'c')
2
Хорошие пункты по вышеуказанному подходу в комментариях. Помимо "просто" нахождения индекса элемента в массиве, учитывая контекст проблемы, это, вероятно, более подходит:
$letters = { 'A', 'B', 'C' }
$letters | % {$i=0} {"Value:$_ Index:$i"; $i++}
Foreach (%) может иметь скрипт Begin sciptblock, который выполняется один раз. Мы устанавливаем здесь индексную переменную, а затем можем ссылаться на нее в скриптовом блоке процесса, где он увеличивается до выхода из скриптового блока.
Ответ 3
Существует один встроенный:)
foreach ($item in $array) {
$array.IndexOf($item)
}
Ответ 4
0..($letters.count-1) | foreach { "Value: {0}, Index: {1}" -f $letters[$_],$_}