#powershell #count
#powershell #считать
Вопрос:
У меня есть скрипт для установки удаленных обновлений, и все это отлично работает. Я просто хочу попытаться добавить некоторое подобие отслеживания хода обновлений.
Я могу получить общее количество, выполнив
$TargetUpdates = Get-ChildItem "C:Updates -Recurse $TargetUpdates.Count
и это показывает мое общее количество. И затем в своем ForEach
заявлении я хочу, чтобы он сказал, что он обрабатывает обновление x
i
ниже приведен фрагмент инструкции ForEach.
ForEach($Update in $TargetUpdates){ Write-Host "[${Env:ComputerName} Processing Update [x] of [i]... }
Та [x] of [i]
часть, где я заблудился. Это, наверное, что-то очень простое, я просто не в состоянии разобраться в этом.
Ответ №1:
Еще одна альтернатива, использующая то, что у вас уже есть:
$TargetUpdates = Get-ChildItem . $total = $TargetUpdates.Count $index = 0 ForEach($Update in $TargetUpdates) { Write-Host "[${env:ComputerName} Processing Update [$(( $index))] of [$total]..." }
Ответ №2:
Для обновления хода выполнения рассмотрите возможность использования потока выполнения с Write-Progress
.
Для отслеживания того, как далеко вы продвинулись в foreach
цикле, вы можете поддерживать простую переменную счетчика:
$counter = 1 foreach($update in $TargetUpdates){ Write-Progress -Activity "Processing updates" -Status "Process update [$counter] or [$($TargetUpdates.Count)]" -PercentComplete (($TargetUpdates.Count / $counter) * 100) # do actual work here Start-Sleep -Milliseconds 200 # remember to increment the counter $counter }
В качестве альтернативы используйте for
цикл:
for($i = 0; $i -lt $TargetUpdates.Count; $i ){ Write-Progress -Activity "Processing updates" -Status "Process update [$($i 1)] of [$($TargetUpdates.Count)]" -PercentComplete (($TargetUpdates.Count / ($i 1)) * 100) $update = $TargetUpdates[$i] # do actual work here Start-Sleep -Milliseconds 200 }
Одношаговые for
циклы также можно эмулировать с помощью оператора диапазона и ForEach-Object
(хотя это может быть нелегко прочитать, если вы привыкли к языкам в стиле C):
0..$($TargetUpdates.Count - 1) |ForEach-Object { Write-Progress -Activity "Processing updates" -Status "Process update [$($_ 1)] of [$($TargetUpdates.Count)]" -PercentComplete (($TargetUpdates.Count / ($_ 1)) * 100) $update = $TargetUpdates[$_] # do actual work here Start-Sleep -Milliseconds 200 }