PowerShell: falla la verificación del número en el rango no secuencial

PowerShell: falla la verificación del número en el rango no secuencial

Tengo una lista de dígitos, algunos secuenciales, otros con saltos. Aquí hay un ejemplo.
(1..10),12,15,(30..45),50,53

Cuando intento consultar si "mi número" está en esta lista (digamos que sí) 4, todas las comprobaciones fallan.

> 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...

¿Qué estoy haciendo mal?

Respuesta1

El comportamiento predeterminado de Powershell con comas es crear matrices de matrices:

(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

4no es igual a 1 2 3 4..., por lo que la comparación es falsa.


Una forma sencilla de obtener lo que busca expresando $()los elementos de la lista separados por punto y coma en lugar de coma, como:

$((1..10);12;15;(30..45);50;53) -contains 4

True

Palabras clave similares desenvuelven o aplanan una lista/matriz

Respuesta2

GraciasJeff Zeitlin. La solución es "aplanar" la matriz. En mi caso, la forma más fácil y compatible de hacer esto era canalizar la salida write-outputy luego verificarla.

> ((1..10),12,15,(30..45),50,53 | write-output) -contains 4
> True

Respuesta3

Existe una sintaxis simple para aplanar una colección de matrices en una sola matriz:

4 -in @((1..10),12,15,(30..45),50,53 | ForEach-Object {$_})

información relacionada