Лучший отвечающий
Write-Progress

Вопрос
-
Задача: сделать прогресбар что бы пользователь не считал что про него забыли
Есть процесс установки ПО который может занимать произвольное время от 10с до 10 мин.
При этом отображается лог отработки наборов скриптов где установка лишь 1 из шагов
for ($i = 1; $i -le 30; $i++ ){ Start-Sleep -s 1 $Progresstime++ write-progress -activity "Test progress" -status "Progress time $Progresstime (sec)." } for ($i = 1; $i -le 30; $i++ ){ Start-Sleep -s 1 $Progresstime++ "Progress time $Progresstime (sec)." }
Вывожу вот такого рода прогрессбар
Который висит до конца работы скрипта
В чем я не прав?
The opinion expressed by me is not an official position of Microsoft
30 марта 2016 г. 15:18Модератор
Ответы
-
по видимому нашел решение
#$Progresstime = 1 for ($k=1; $k -lt 2; $k++){ $Progresstime = 1 "First block: $k" while($Progresstime -lt 10) { Start-Sleep -s 1 $Progresstime++ write-progress -activity "Test progress" -status "Progress time $Progresstime (sec)." -id 1 } } # End For Write-Progress -activity "Test progress" -Id 1 -Completed for ($i=1; $i -lt 30 ; $i++){ Start-Sleep -s 1 "Second block $i (sec)." }
Слегка не логично но пусть...
The opinion expressed by me is not an official position of Microsoft
- Помечено в качестве ответа Vector BCOModerator 30 марта 2016 г. 17:13
30 марта 2016 г. 16:48Модератор
Все ответы
-
Как пример:
$p = Start-Process calc -PassThru $Progresstime = 1 while(!$p.HasExited) { Start-Sleep -s 1 $Progresstime++ write-progress -activity "Test progress" -status "Progress time $Progresstime (sec)." }
30 марта 2016 г. 16:09Отвечающий -
У меня прогресбар отображается нормально и время отображает, но после того как loop закончился и скрипт идет дальше прогресбар не исчезает
в примере из вопроса это видно
подозреваю что можно засунуть всю эту конструкцию в функцию, но это как то сильно костыльно
for ($k=1; $k -lt 5; $k++){ $Progresstime = 1 "First block: $k" while($Progresstime -lt 10) { Start-Sleep -s 1 $Progresstime++ write-progress -activity "Test progress" -status "Progress time $Progresstime (sec)." } } # End For for ($i=1; $i -lt 30 ; $i++){ Start-Sleep -s 1 "Second block $i (sec)." }
У меня когда идет вывод "Second block $i (sec).", все еще висит Write-Progress
The opinion expressed by me is not an official position of Microsoft
30 марта 2016 г. 16:45Модератор -
по видимому нашел решение
#$Progresstime = 1 for ($k=1; $k -lt 2; $k++){ $Progresstime = 1 "First block: $k" while($Progresstime -lt 10) { Start-Sleep -s 1 $Progresstime++ write-progress -activity "Test progress" -status "Progress time $Progresstime (sec)." -id 1 } } # End For Write-Progress -activity "Test progress" -Id 1 -Completed for ($i=1; $i -lt 30 ; $i++){ Start-Sleep -s 1 "Second block $i (sec)." }
Слегка не логично но пусть...
The opinion expressed by me is not an official position of Microsoft
- Помечено в качестве ответа Vector BCOModerator 30 марта 2016 г. 17:13
30 марта 2016 г. 16:48Модератор -
Как раз в моем примере это и учтено, пока процесс работает HasExited=false Write-Progress работает, как только завершается, то и Write-Progress - завершается.30 марта 2016 г. 16:49Отвечающий
-
Увы но по крайней мере у меня не отрабатывает
$p = Start-Process calc -PassThru $Progresstime = 1 while(!$p.HasExited) { Start-Sleep -s 1 $Progresstime++ write-progress -activity "Test progress" -status "Progress time $Progresstime (sec)." } for ($i=1; $i -lt 100 ; $i++){ Start-Sleep -s 1 "Second block $i (sec)." }
Первый кусок взят из вашего примера второй кусок имитирует дальнейшую отработку скрипта
в итоге получаем зависший Write-Progress с временем за который закрылся калк
что в ISE что в чистой консоли поведение одинаково
калк я закрыл через 6 секунд после начала, дальше пошел вывод второго блока
The opinion expressed by me is not an official position of Microsoft
30 марта 2016 г. 17:04Модератор