我想对脚本执行进度条,但随后需要的文件夹总数。
之间的运行时之间是否存在重大区别:
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中这种调用开销非常大。