2009-11-23 76 views
45

給出powershell中的項目列表,我如何從循環內找到當前項目的索引?獲取Powershell循環中當前項目的索引?

例如:

$letters = { 'A', 'B', 'C' } 

$letters | % { 
# Can I easily get the index of $_ here? 
} 

所有這一切的目標是,我想使用的輸出格式表的集合,並且與當前項目的索引添加初始列。這樣人們可以交互式地選擇一個項目來選擇。

回答

20

不確定這是可能的「自動」變量。 您可以隨時申報一個爲自己和增加它

$letters = { 'A', 'B', 'C' } 
$letters | % {$counter = 0}{...;$counter++} 

或使用for循環,而不是...

for ($counter=0; $counter -lt $letters.Length; $counter++){...} 
+0

實施例:'> 「A,B,C,d,E,F,G」 -split 「」 | %{$ i = 0} {if($ i -gt 3){$ _}; ++ $ i}'輸出:'E F G' – Andrew 2017-10-28 03:23:52

+0

當我不得不使用計數器重命名文件時, %{$ i = 46} {move-item $ _(「ARM- {0:00000} .pdf」-f $ i ++)}' – Sung 2017-12-15 20:22:17

48

.NET有這樣的事情在一些System.Array的方便實用方法:

PS> $a = 'a','b','c' 
PS> [array]::IndexOf($a, 'b') 
1 
PS> [array]::IndexOf($a, 'c') 
2 

上述方法的好處在評論中。此外,「只是」發現在數組中的項的指標給出的問題的情況下,這可能是更適合:

$letters = { 'A', 'B', 'C' } 
$letters | % {$i=0} {"Value:$_ Index:$i"; $i++} 

的foreach(%)可以有一個開始sciptblock執行一次。我們在那裏設置一個索引變量,然後我們可以在進程腳本塊中引用它,在退出腳本塊之前它會增加。

+3

如果數組包含重複項,則可能有問題... – 2009-11-24 06:55:06

+5

不要在迭代這些項目時查找數組項目的每個索引。這將是每個項目的線性搜索;聽起來像做一個迭代O(n^2):-) – Joey 2009-11-24 07:39:07

8
0..($letters.count-1) | foreach { "Value: {0}, Index: {1}" -f $letters[$_],$_} 
+0

這是足夠乾淨的,但它太糟糕了沒有直接的方法,不涉及搜索數組中的索引。 – 2010-12-10 20:38:22

26

有一個內置的:)

foreach ($item in $array) { 
    $array.IndexOf($item) 
} 
+0

可能這是一個比2009年使用的PS更新的版本,否則這應該是現在接受的答案。 – 2015-09-13 12:55:59

+0

你是完全正確的。在PowerShell 2.0推出一個月後,原來的問題被問到,並且在PowerShell 3.0中添加了IndexOf。 – 2015-09-14 00:19:09

+8

這是查找匹配數組中每個項目的第一個項目的索引,而不是迭代索引值。這比較慢,如果數組包含重複的項目,您將得到錯誤的索引。 – mdonoughe 2017-04-30 19:51:19

相關問題