【问题标题】:PowerShell Write-Progress while iterating over a hash GetEnumerator()迭代哈希 GetEnumerator() 时的 PowerShell 写入进度
【发布时间】:2021-01-25 12:09:03
【问题描述】:

如果您正在迭代一个数组,使用 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++ 包含在循环中,但是还有其他方法吗?

【问题讨论】:

  • 嗯...我不确定我是否做对了。您可以在循环内通过$item.Name 访问键和通过$item.Value 访问值
  • 没有索引,因为哈希表不保留任何项目的顺序。请改用计数器变量。

标签: powershell hashtable


【解决方案1】:

您不需要索引。事实上,它对于哈希表来说有点没有意义,因为它们不像数组那样以固定的顺序存储。你可以这样做:

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() 方法的任何内容,因此您需要坚持使用 counter 变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2014-12-15
    相关资源
    最近更新 更多