2012-07-11 62 views
5

我有一大組項目,我想從中提取項目。我需要跳過一些項目從開始和一些結束。如何從PowerShell中的集合中提取範圍?

以下示例已簡化。

我第一次嘗試提取邊界元件:

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

可正常工作。然而,當我試圖提取整個範圍時,它會返回比我想要的更多的東西(與Python的['a', 'b', 'c', 'd', 'e'][1:-1]效果不錯)。

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

它以相反的方式循環。如何改變循環的方向?

我想得到:b c d

是否有解決方案,而不使用真正的集合的長度?

回答

5

1 ..- 2不會從第一個項目開始計數,直到從結尾開始兩個項目。將數組保存到變量中,並通過計算數組長度減去末尾的項來指定上限。

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

不使用長度可能嗎? – 2012-07-11 10:47:34

+0

不是我所知道的,將數組賦值給一個變量是我不喜歡的一部分。你需要首先知道上限,才能獲得除最後兩個之外的所有項目。 – 2012-07-11 11:22:47

+0

如果對象順序不計算可能與此:'a','b','c','d','e'|排序|選擇-skip 1 | sort -desc |選擇-skip 1 – 2012-07-11 11:44:19

1

要只是祛瘀前兩個那些你可以這樣做:

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

如何從兩側移除? – 2012-07-11 14:07:53

3

由於距離運營商不會做你需要什麼,一個簡單的管道可以完成手頭的任務,儘管這會可能會影響大型館藏的表現。

開始了收集和元素的數量從頂部和底部,從修剪:

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

使用此...

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

...或者,如果您已經安裝PSCX ,這個更簡潔優雅的序列:

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

兩者都返回b c witho ut明確使用length屬性。調整兩個參數以將輸出調整爲不同的範圍。