Я думаю, что ваша проблема в том, что у вас есть вызов Get-ChildItem внутри l oop, который не имеет смысла и не будет работать. Вытащить его наружу должно работать:
$Progress = @{
Activity = 'Building Source Folders'
CurrentOperation = "Verifying/Building"
PercentComplete = 0
}
Write-Progress @Progress
$u = 0
$folders = Get-ChildItem C:\Source -Recurse
ForEach ($f in $folders) {
$u++
[int]$percentage = ($u / $folders.count)*100
$progress.CurrentOperation = "$f"
$progress.PercentComplete = $percentage
Write-Progress @Progress
}
И в зависимости от того, сколько папок мы здесь говорим, стоит задуматься о влиянии на производительность. Write-Progress довольно медленный.
На моем компьютере 10 000 вызовов Write-Progress занимают 10 секунд с использованием этого кода:
Measure-Command {
for( $i = 0; $i -lt 10000; $i++ ) {
Write-Progress -Activity '' -Status "$i of 10,000" -Id 1 -PercentComplete 0
}
}
Один из вариантов - выполнить проверку и выполнить только запись. Прогресс каждый так часто. Эта версия делает это каждые 100 итераций (то есть 100 вызовов Write-Progress), и этот код выполняется на моей машине за 0,046 секунды:
Measure-Command {
for( $i = 0; $i -lt 10000; $i++ ) {
# Only do a Write-Progress on every 100th loop iteration
if( $i % 100 -eq 0 )
{
Write-Progress -Activity '' -Status "$i of 10,000" -Id 1 -PercentComplete 0
}
}
}