我想对脚本执行进度条,但随后需要的文件夹总数。

之间的运行时之间是否存在重大区别:

Get-ChildItem $path -Directory | ForEach-Object {
    #do work
}


$folders = Get-ChildItem $path -Directory
foreach($folder in $folders){
    #do work
}

然后,我可以使用$folders.Count作为我的文件夹总数。我不知道如何用foreach-object循环来实现。

最佳答案

管道被设计为可以在项目出现时立即对其进行处理,因此在管道传输过程中,列表的整个长度是未知的。

Get-ChildItem $path -Directory | ForEach {
    # PROCESSING STARTS IMMEDIATELY
    # LENGTH IS NOT KNOWN
}
  • 优点:处理立即开始,构建列表没有延迟。
  • 缺点:列表长度直到完全处理后才知道

  • 另一方面,将列表分配给变量将在此时构建整个列表,如果列表包含很多项目或构建速度较慢(例如,如果它是一个包含很多目录的目录),则可能会花费大量时间嵌套子目录或慢速网络目录。
    # BUILD THE ENTIRE LIST AND ASSIGN IT TO A VARIABLE
    $folders = Get-ChildItem $path -Directory
    # A FEW MOMENTS/SECONDS/MINUTES/HOURS LATER WE CAN PROCESS IT
    ForEach ($folder in $folders) {
        # LENGTH IS KNOWN: $folders.count
    }
    
  • 构建列表+ ForEach语句的优势:花费的总时间更少,因为不会在每个项目上调用{ }块,而通过管道将其像函数或脚本块一样调用,并且在PowerShell中这种调用开销非常大。
  • 劣势:列表分配语句中的初始延迟可能非常巨大
  • 07-27 20:01