PowerShell - Überprüfung von Zahlen in nicht sequenziellem Bereich schlägt fehl

PowerShell - Überprüfung von Zahlen in nicht sequenziellem Bereich schlägt fehl

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

4ist 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-outputund 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 {$_})

verwandte Informationen