PowerShell 写入进度,同时迭代哈希 GetEnumerator()

问题描述

如果您正在迭代一个数组,使用 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() 方法的任何内容,因此您需要坚持使用计数器变量。>