2009-11-23 77 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

相关问题