2012-07-11 9 views
5

Ho una vasta serie di articoli e voglio estrarre elementi da esso. Ho bisogno di saltare alcuni elementi dall'inizio e altri dalla fine.Come estrarre un intervallo da una raccolta in PowerShell?

Il seguente esempio è semplificato.

primo luogo ho cercato di estrarre gli elementi di delimitazione:

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

Questo funziona come previsto.

Tuttavia, quando ho provato a estrarre un'intera gamma, restituisce qualcosa di diverso da quello che voglio (al contrario di Python ['a', 'b', 'c', 'd', 'e'][1:-1] che funziona bene).

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

Si sposta a rovescio. Come cambiare la direzione del loop?

Voglio ottenere: b c d.

Esiste una soluzione senza utilizzare la lunghezza reale della raccolta?

risposta

5

1 ..- 2 non contano dal primo elemento fino a due articoli dalla fine. Salvare l'array in una variabile e specificare il limite superiore calcolando la lunghezza dell'array meno gli articoli dalla fine.

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

E 'possibile senza usare la lunghezza? –

+0

Non che ne sia a conoscenza, l'assegnazione dell'array a una variabile è una parte che non mi piace neanche. È necessario conoscere prima il limite superiore per ottenere tutti gli elementi tranne gli ultimi due. –

+0

Se l'ordine degli oggetti non conta forse con questo: 'a', 'b', 'c', 'd', 'e' | ordinare | selezionare -skip 1 | ordina -desc | select -skip 1 –

1

Per REMOV solo i primi due quelli che si possono fare che:

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

Come rimuovere da entrambi i lati? –

3

Dal momento che l'operatore di intervallo non fa quello che avete bisogno, un semplice gasdotto può realizzare il compito a portata di mano, anche se questa volontà probabile impatto sulle prestazioni per una grande collezione.

Inizia con una collezione ed il numero di elementi da tagliare dall'alto e dal basso:

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

Utilizzare questo ...

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

... o, se è stato installato PSCX , questo più concisa ed elegante sequenza:

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

Sia di coloro che ritornano b c witho ut utilizzando esplicitamente la proprietà length. Regolare i due parametri per adattare l'uscita a diversi intervalli.

Problemi correlati