Powershell Get-ChildItem进度问题

Tej*_*ejs 8 powershell performance pipeline progress get-childitem

所以,我在一个文件夹中有一组目录00-99.每个目录都有100个子目录,00-99.每个子目录都有数千个图像.

我正在尝试做的基本上是在计算平均文件大小时得到进度报告,但我无法让它工作.这是我当前的查询:

get-childitem <MyPath> -recurse -filter *.jpeg | Where-Object { Write-Progress "Examining File $($_.Fullname)" true } | measure-object -Property length -Average
Run Code Online (Sandbox Code Playgroud)

这显示了一个在每个文件被处理时更新的栏,但最后我没有回到平均文件大小数据.显然,我做错了,因为我试图破解Where-Object打印进度声明可能是一个坏主意(tm).

由于存在数百万个图像,因此该查询显然需要非常长的时间才能工作.如果我理解正确的话,get-childitem几乎是查询时间的一部分.什么指针得到我想要的?AKA,我的结果理想情况是:

Starting...
Examining File: \00\00\Sample.jpeg
Examining File: \00\00\Sample2.jpeg
Examining File: \00\00\Sample3.jpeg
Examining File: \00\00\Sample4.jpeg
...
Examining File: \99\99\Sample9999.jpg
Average File Size: 12345678.244567
Run Code Online (Sandbox Code Playgroud)

编辑:我可以做简单的选项:

get-childitem <MyPath> -recurse -filter *.jpeg | measure-object -Property length -Average
Run Code Online (Sandbox Code Playgroud)

然后离开我的工作站一天半或者其他东西,但这似乎有点低效= /

man*_*lds 11

像这样的东西?

get-childitem -recurse -filter *.exe | 
      %{Write-Host Examining file: $_.fullname; $_} | 
      measure-object -Property length -Average
Run Code Online (Sandbox Code Playgroud)

  • `%`实际上是重载的.它是`ForEach-Object`的别名,它也是模(或模数)运算符. (4认同)
  • 并且 `%` 与 `ForEach-Object` 相同 (3认同)
  • 基本上接收对象,然后写入 `Write-Host Examining file: $_.fullname;` 并将对象传递给下游 `$_` (2认同)

Emi*_*ggi 5

更详细的进展:

$images = get-childitem -recurse -filter *.jpeg

$图像| % -begin { $i=0 } `
-process { write-progress -activity "计算平均值..." -status "检查文件:$image.fullpath ($i of $($images.count))" -percentcomplete ($i/$images.count*100 ); $i+=1 } `
-end { write-output "平均文件大小为:$($images | measure-object -Property length -Average)" }

  • Ops...我认为这是由于在`end` 块中丢失了双引号。我已经编辑了答案。它现在应该可以工作了。谢谢。+1 给它一个尝试和反馈:) (2认同)
  • 现在脚本运行但写入输出返回“平均文件大小为:Microsoft.PowerShell.Commands.GenericMeasureInfo”。如果我以这种方式更改代码的最后一部分:写输出“平均文件大小是:” $($images | measure-object -property length -average).Average 似乎有效。还是+1。你的帖子总是很有启发性。再见。 (2认同)