
Ich habe eine Liste mit Ziffern, einige fortlaufend, einige mit Unterbrechungen. Hier ist ein Beispiel.
(1..10),12,15,(30..45),50,53
Wenn ich versuche abzufragen, ob „meine Nummer“ in dieser Liste steht – sagen wir, sie steht dort 4
–, schlagen alle Prüfungen fehl.
> 4 -in (1..10),12,15,(30..45),50,53
> False
> (1..10),12,15,(30..45),50,53 -contains 4
> False
> ((1..10),12,15,(30..45),50,53).contains(4)
> False
> (1..10),12,15,(30..45),50,53
> 1
2
3
4
etc...
Was mache ich falsch?
Antwort1
Das Standardverhalten von Powershell mit Kommas besteht darin, Arrays von Arrays zu erstellen:
(1..10),12,15,(30..45),50,53 | Foreach {$_ -join ' '}
1 2 3 4 5 6 7 8 9 10
12
15
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
50
53
4
ist ungleich 1 2 3 4...
, also ist der Vergleich falsch.
Eine einfache Möglichkeit, das gewünschte Ergebnis zu erzielen, besteht darin, $()
die Listenelemente durch Semikolon statt durch Komma zu trennen, etwa:
$((1..10);12;15;(30..45);50;53) -contains 4
True
Ähnliche Schlüsselwörter sind das Auspacken oder Reduzieren einer Liste/eines Arrays
Antwort2
DankeJeff Zeitlin. Die Lösung besteht darin, das Array zu „glätten“. In meinem Fall war die einfachste und kompatibelste Möglichkeit, dies zu tun, die Ausgabe an weiterzuleiten write-output
und das dann zu überprüfen.
> ((1..10),12,15,(30..45),50,53 | write-output) -contains 4
> True
Antwort3
Es gibt eine einfache Syntax, um eine Sammlung von Arrays in ein einziges Array zusammenzufassen:
4 -in @((1..10),12,15,(30..45),50,53 | ForEach-Object {$_})