2012-07-11 21 views
5

Tengo un gran conjunto de elementos y quiero extraer elementos de él. Necesito omitir algunos elementos desde el inicio y algunos desde el final.¿Cómo extraer un rango de una colección en powershell?

El siguiente ejemplo está simplificado.

primera vez que trató de extraer los elementos delimitadores:

> ("a", "b", "c", "d", "e")[1,-2] 
b 
d 

Esto funciona como se esperaba.

Sin embargo, cuando traté de extraer todo el rango, devuelve algo más de lo que quiero (en contraste con el ['a', 'b', 'c', 'd', 'e'][1:-1] de Python que funciona bien).

> ("a", "b", "c", "d", "e")[1..-2] 
b 
a 
e 
d 

Loops al revés. ¿Cómo cambiar la dirección del bucle?

Quiero obtener: b c d.

¿Existe alguna solución sin utilizar la longitud real de la colección?

Respuesta

5

1 ..- 2 no contará desde el primer elemento hasta dos elementos desde el final. Guarde el conjunto en una variable y especifique el límite superior calculando la longitud del conjunto menos los elementos del final.

$a = "a", "b", "c", "d", "e" 
$a[1..($a.length-2)] 
+0

¿Es posible sin usar la longitud? –

+0

No es que yo sepa, asignar la matriz a una variable es una parte que tampoco me gusta. Primero debe conocer el límite superior para obtener todos los elementos, pero los últimos dos. –

+0

Si el orden de los objetos no cuenta, quizás con esto: 'a', 'b', 'c', 'd', 'e' | ordenar | seleccionar -skip 1 | ordenar -desc | select -skip 1 –

1

Para simplemente Remov los dos primeros se puede hacer lo siguiente:

$null,$null,$a = "a", "b", "c", "d", "e" 
+0

¿Cómo eliminar de ambos lados? –

3

Dado que el operador de rango no hace lo que necesita, una tubería simple puede llevar a cabo la tarea en cuestión, aunque esto probable impacto de rendimiento para una gran colección.

de inicio con una colección y el número de elementos de ajuste de arriba y de abajo:

$a = "a", "b", "c", "d", "e" 
($fromTop,$fromBottom) = 1, 2 

Utilice esta ...

$a | select -skip $fromTop | select -skip $fromBottom -last 1000000 

... o, si ha instalado PSCX , esto más concisa y elegante secuencia:

$a | skip -first $fromTop -last $fromBottom 

Tanto de los que regresan b c witho ut explícitamente usando la propiedad de longitud. Ajuste los dos parámetros para adaptar la salida a diferentes rangos.

Cuestiones relacionadas