在 powershell 中使用带有 foreach-object 的索引

Using an Index with foreach-object in powershell

我有这个代码:

Get-ChildItem FOLDERNAMEHERE *.png| ForEach-Object { $_.Name } > fileNames.txt

它打印出文件名列表,我想将其更改为只打印出数字索引而不是名称。

输出以1开头的序列号(将$i = 0替换为$i = -10开头):

Get-ChildItem FOLDERNAMEHERE *.png |
  ForEach-Object -Begin { $i = 0 } -Process { (++$i) }

请注意,变量 $i 在此命令之后继续存在,并且,如果它在 运行 命令之前就已存在,则有效地更改它,因为脚本块传递给 ForEach-Object 运行 直接在调用者的范围内。

递增赋值操作(++) is wrapped in (...)以便也输出增量值(赋值语句默认不产生输出)。

顺便说一句:

  • GitHub issue #13772 proposes introducing an automatic 管道中使用的索引变量,例如$PSIndex,这将简化解决方案:

    Get-ChildItem FOLDERNAMEHERE *.png | ForEach-Object { $PSIndex + 1 }
    

Non-streaming替代,使用..range operator

if ($count = (Get-ChildItem FOLDERNAMEHERE *.png).Count) {
  1..$count
}

注意:Non-streaming 表示 Get-ChildItem 调用的结果是预先完整收集的,以确定序列号的上限。

类似地,1..$count 范围操作在开始生成可见输出之前预先收集数组中范围端点之间的元素。请参阅评论以进行讨论。

换句话说:如果 Get-ChildItem 命令产生大量输出对象并且您想尽快开始发出序列号,请使用基于 ForEach-Object 的流式解决方案。