2009-11-23 7 views
45

Wie finde ich den Index des aktuellen Elements aus einer Schleife in einer Liste von Elementen in Powershell?Index des aktuellen Elements in Powershell loop abgerufen?

Zum Beispiel:

$letters = { 'A', 'B', 'C' } 

$letters | % { 
# Can I easily get the index of $_ here? 
} 

Ziel all das ist, dass ich ausgeben will eine Sammlung mit Format-Table und füge eine anfängliche Spalte mit dem Index des aktuellen Elements. Auf diese Weise können Benutzer interaktiv einen Artikel auswählen.

Antwort

20

Nicht sicher, ob es mit einer "automatischen" Variable möglich ist. Sie können immer ein für sich selbst erklären, und es erhöht

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

oder eine for Schleife stattdessen ...

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

Beispiel: '> "A, B, C, D, E, F, G" -split "" | % {$ i = 0} {if ($ i -gt 3) {$ _}; ++ $ i} 'Ausgabe:' E F G' – Andrew

+0

Es funktionierte wie ein Zauber, wenn ich Dateien mit einem Zähler ~ 'dir | umbenennen musste % {$ i = 46} {move-item $ _ ("ARM- {0: 00000} .pdf" -f $ i ++)} ' – Sung

48

.NET hat einige praktische Anwendung Methoden für diese Art der Sache in System.Array :

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

Gute Punkte auf dem obigen Ansatz in den Kommentaren. Neben „nur“ in einem Array einen Index eines Elements zu finden, da der Kontext des Problems, ist es wahrscheinlich besser geeignet:

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

foreach (%) kann einen sciptblock beginnen, die einmal ausgeführt wird. Wir setzen dort eine Indexvariable und können sie dann im Prozess-Scripblock referenzieren, wo sie vor dem Verlassen des Skriptblocks inkrementiert wird.

+3

Es kann ein Problem geben, wenn das Array Duplikate enthält ... –

+5

Auch Sie wahrscheinlich Ich möchte nicht jeden Index eines Array-Elements nachschlagen, während ich diese Elemente iteriere. Das wäre lineare Suche nach jedem Gegenstand; klingt wie eine Iteration O (n^2) :-) – Joey

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

Das ist sauber genug, aber es ist schade, dass es keine direkte Methode gibt, die nicht nach dem Index im Array sucht. –

26

Es gibt einen in :) gebaut ist

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

Möglicherweise wurde dies in eine neuere Version von PS eingefügt, als sie 2009 verwendet wurde, ansonsten sollte dies jetzt die akzeptierte Antwort sein. –

+0

Sie haben völlig Recht. Die ursprüngliche Frage wurde einen Monat nach PowerShell 2.0 und IndexOf in PowerShell 3.0 gestellt. –

+8

Hier wird der Index des ersten Elements gefunden, der mit jedem Element im Array übereinstimmt und nicht mit einem Indexwert iteriert wird. Dies ist langsamer und wenn das Array doppelte Elemente enthält, erhalten Sie die falschen Indizes. – mdonoughe

Verwandte Themen