问题描述
如果您正在迭代一个数组,使用 Write-Progress
很容易提供反馈,因此:
$items = @('a','b','c')
foreach ($item in $items) {
Write-Progress -Activity 'Foo' -PercentComplete ($items.IndexOf($item) * 100 / $items.Count) -CurrentOperation $item
Start-Sleep 2
}
是否有类似的技巧可以在迭代哈希时使用?
$items = @{'x' = 'a'; 'y' = 'b'; 'z' = 'c'}
foreach ($item in $items.GetEnumerator()) {
Write-Progress ...
Start-Sleep 2
}
我仍然可以访问 $items.count
,但似乎没有办法从枚举器中获取项目的索引。
我很感激我可以在开始时简单地声明 $i=0
并在循环中包含 $i++
但还有其他方法吗?
解决方法
您不需要拥有索引。事实上,它对哈希表来说有点无意义,因为它们不像数组那样以固定的顺序存储。你可以简单地这样做:
foreach ($item in $items.GetEnumerator()) {
Write-Progress -Activity 'Foo' -PercentComplete ($i++ / $items.Count *100) -CurrentOperation $item.key
Start-Sleep 2
}
如果您可能在一个会话中多次运行代码,请使用 foreach
将 $i = 0
之前的计数归零。
如果您确实希望按照您添加的顺序处理项目,请将 [Ordered]
属性添加到您的哈希表中:
$items = [Ordered]@{'x' = 'a'; 'y' = 'b'; 'z' = 'c'}
这将允许您索引到哈希表(例如 $thirdItem = $items[2]
),但不提供类似于 IndexOf()
方法的任何内容,因此您需要坚持使用计数器变量。>