PowerShell. Как обработать текущее количество товаров по сравнению с общим количеством товаров

#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 }