none
Write-Progress RRS feed

  • Вопрос

  • Задача: сделать прогресбар что бы пользователь не считал что про него забыли

    Есть процесс установки ПО который может занимать произвольное время от 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
    Модератор