Index van huidig ​​item in een PowerShell-lus ophalen

Gegeven een lijst met items in PowerShell, hoe vind ik de index van het huidige item vanuit een lus?

Bijvoorbeeld:

$letters = { 'A', 'B', 'C' }
$letters | % {
  # Can I easily get the index of $_ here?
}

Het doel van dit alles is dat ik een verzameling wil uitvoeren met behulp van Format-Tableen voeg een eerste kolom toe met de index van het huidige item. Op deze manier kunnen mensen interactief een item kiezen om te selecteren.


Antwoord 1, autoriteit 100%

.NET heeft enkele handige hulpprogramma’s voor dit soort dingen in System.Array:

PS> $a = 'a','b','c'
PS> [array]::IndexOf($a, 'b')
1
PS> [array]::IndexOf($a, 'c')
2

Goede punten over de bovenstaande aanpak in de opmerkingen. Naast het “gewoon” vinden van een index van een item in een array, gezien de context van het probleem, is dit waarschijnlijk meer geschikt:

$letters = { 'A', 'B', 'C' }
$letters | % {$i=0} {"Value:$_ Index:$i"; $i++}

Foreach (%) kan een Begin-scriptblok hebben dat één keer wordt uitgevoerd. We stellen daar een indexvariabele in en dan kunnen we ernaar verwijzen in het processcriptblok waar het wordt verhoogd voordat het scriptblok wordt afgesloten.


Antwoord 2, autoriteit 89%

Ik weet niet zeker of het mogelijk is met een “automatische” variabele. Je kunt er altijd een voor jezelf declareren en verhogen:

$letters = { 'A', 'B', 'C' }
$letters | % {$counter = 0}{...;$counter++}

Of gebruik in plaats daarvan een for-lus…

for ($counter=0; $counter -lt $letters.Length; $counter++){...}

Antwoord 3, autoriteit 75%

Voor PowerShell 3.0 en hoger is er een ingebouwd 🙂

foreach ($item in $array) {
    $array.IndexOf($item)
}

Antwoord 4, autoriteit 22%

0..($letters.count-1) | foreach { "Value: {0}, Index: {1}" -f $letters[$_],$_}

Antwoord 5

Voor degenen die hier van Google komen zoals ik, latere versies van Powershell hebben een automatische variabele $foreach. U kunt het “huidige” object vinden met $foreach.Current

Other episodes