Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Совместить секундомер и прогресс бар (http://forum.oszone.net/showthread.php?t=346892)

Uragan66 31-10-2020 12:06 2938260

Совместить секундомер и прогресс бар
 
Доброго времени суток всем!
Некоторые скрипты работают довольно длительное время. Чтобы как-то контролировать процесс, можно было бы добавлять прогресс бар. Но универсального решения нет и нужно в каждом скрипте мозговать другой код для добавления прогресс бара.
Есть простой секундомер для контроля времени работы скрипта:
Код:

    $watch = [System.Diagnostics.Stopwatch]::StartNew()
    $watch.Start()
 
    Скрипт
 
    $watch.Stop()
    $watch.Elapsed

Возможно ли совместить его с прогресс баром? То есть скрипт запустился, секундомер начал отсчитывать время и пошла полоска прогресс бара. Может можно как-то данные для прогресс бара брать с этого секундомера?

Iska 31-10-2020 14:31 2938267

Uragan66, нет. Прогресс-бар имеет смысл, когда известно начальное значение, конечное значение и хоть какие-то реперные точки.

Foreigner 31-10-2020 14:43 2938271

Uragan66,

Может Write-Progress?

Код:

for ($i = 1; $i -lt 50; $i++)
{
    $perc = $i * 2
    $sec = 50 - $i
    Write-Progress -Activity { Какой-то отчет о текущем выполнении } -PercentComplete $perc -SecondsRemaining $sec
    Start-Sleep 1
}

Но работает вроде только в цикле.

Uragan66 31-10-2020 14:53 2938273

Цитата:

Цитата Foreigner
Но работает вроде только в цикле »

Foreigner, да, такой код работает только, когда в коде есть цикл. Пишу скрипты для облегчения рутинной работы с плейлистами IPTV, а циклы, если и есть, то значений для прогресс бара недостаточно. Да и не весь код это будет.
Цитата:

Цитата Iska
нет. Прогресс-бар имеет смысл, когда известно начальное значение, конечное значение и хоть какие-то реперные точки »

жаль... что здесь не получится.

Iska 31-10-2020 15:49 2938280

Цитата:

Цитата Uragan66
…для облегчения рутинной работы с плейлистами IPTV »

А что Вы с ними делаете?

Uragan66 31-10-2020 15:59 2938281

Цитата:

Цитата Iska
А что Вы с ними делаете? »

Iska, да много чего... Например, удаление дубликатов каналов, добавление в плейлист различных директив (для распознавания каналов файлом телепрограммы, деления по группам и т.д.), сканирование потоков на валидность. Да и другие задачи, типа как создание того же плейлиста из ссылок... Многие из этих задач можно и в блокноте решить, но автоматизация + дальнейшее отправление на "облако", конечно же удобнее...

Busla 31-10-2020 17:03 2938288

Uragan66, описанные вами задачи не выглядят сколько-нибудь тяжеловесными, чтобы хотя бы успеть заметить/увидеть прогресс-бар

YuS_2 31-10-2020 17:23 2938291

Цитата:

Цитата Uragan66
Пишу скрипты для облегчения рутинной работы с плейлистами IPTV, а циклы, если и есть, то значений для прогресс бара недостаточно. Да и не весь код это будет. »

Чтобы сказать о том, что возможно, а что нет, необходимо таки увидеть скрипт...

Цитата:

Цитата Busla
описанные вами задачи не выглядят сколько-нибудь тяжеловесными »

зависит от размера плейлистов... а их иногда склеивают из нескольких и на выходе получают достаточно объемные текстовые файлы...

Uragan66 31-10-2020 19:36 2938318

Цитата:

Цитата Busla
описанные вами задачи не выглядят сколько-нибудь тяжеловесными, чтобы хотя бы успеть заметить/увидеть прогресс-бар »

Задачи с текстовым содержимым плейлистов таки да, выполняются достаточно быстро. Но, к примеру, та же проверка потоков на работоспособность или какой-нить сканер занимают по времени 30-40 мин. и поболее. Всё зависит от объёмности плейлиста, как ниже правильно заметили.
Но вопрос то даже не в том, можно заметить движение прогресс бара или нет. Если в скрипте есть циклы, то можно прогресс бар добавить, но опять таки он будет работать не всё время выполнения скрипта... Да и для каждого скрипта нужно свой прогресс бар мудрить.
Поэтому и подумал о секундомере, чтобы с него как-то брать данные для прогресс бара и это было бы универсальным решением для любого скрипта.
Цитата:

Цитата YuS_2
Чтобы сказать о том, что возможно, а что нет, необходимо таки увидеть скрипт... »

YuS_2, да скрипты то разные, соответственно и решения с прогресс баром будут разными... Хотелось бы что-то универсальное.
Есть такой скрипт:
Код:

Add-Type -AssemblyName PresentationCore,PresentationFramework
[xml]$xaml = @"
<Window Name="main"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="250.456" Width="223.212">
    <Grid Margin="0,0,2,0">
        <Label HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="-1.028,-1.353" Width="186" Height="38">
            <Grid Height="38" Margin="0,0,0,0" Width="176">
                <TextBlock HorizontalAlignment="Left"  TextWrapping="Wrap" Text="Запуск скрипта" VerticalAlignment="Top" Height="28" Width="97" FontSize="18" FontFamily="Segoe Script" Margin="10,0,0,0"/>
                <TextBlock Name="Count" Text="" HorizontalAlignment="Right"  TextWrapping="Wrap" VerticalAlignment="Top" Height="28" Width="48" FontSize="18" FontFamily="Segoe Script"/>
            </Grid>
        </Label>
        <Button Name="inc" Content="Запустить скрипт"  HorizontalAlignment="Left" Margin="10,53,0,0" VerticalAlignment="Top" Width="180" Height="45">         
        </Button>
        <ProgressBar Minimum="0" Maximum="100" Margin="10,93,0,0" HorizontalAlignment="Left" Width="180" Height="45" Name="pbStatus" />
    </Grid>
</Window>
"@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load( $reader )
$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | %{
    Set-Variable -Name ($_.Name) -Value $Window.FindName($_.Name) -Scope Global
}
$inc.add_click({
    $pbStatus.isIndeterminate=$true
    $runspace = [runspacefactory]::CreateRunspace()
    $runspace.Open()
    $runspace.SessionStateProxy.SetVariable('pbStatus',$pbStatus)
    $powershell = [powershell]::Create()
    $powershell.Runspace = $runspace
    $powershell.AddScript({

Здесь любой скрипт

        $pbStatus.Dispatcher.invoke([action]{$pbStatus.isIndeterminate=$false})
        $pbStatus.Dispatcher.invoke([action]{$pbStatus.value=100})
    })
    $powershell.BeginInvoke()
})
$Window.showdialog()

Прошу прощения, что не указываю автора, просто не помню где нашел этот код.
Работает с любым скриптом... Но неудобно с него запускать скрипты, лишнее окно и т.д. Да и сам прогресс бар просто движется непрерывно.

Iska 31-10-2020 20:52 2938332

Тогда можно. Сначала считаем общее число каналов, это будет конечной точкой. Затем, в процессе поиска дубликатов/сканирования потоков на валидность/прочая, выводим текущее значение для прогресс-бара.

Цитата:

Цитата Uragan66
Поэтому и подумал о секундомере, чтобы с него как-то брать данные для прогресс бара и это было бы универсальным решением для любого скрипта. »

Отнюдь. Вы ведь не знаете заранее, сколько времени понадобится для полной обработки?

Uragan66 31-10-2020 21:14 2938336

Цитата:

Цитата Iska
Сначала считаем общее число каналов, это будет конечной точкой. Затем, в процессе поиска дубликатов/сканирования потоков на валидность/прочая, выводим текущее значение для прогресс-бара »

Iska, спасибо! Задумка хорошая, может в каком-то скрипте попробую применить.
Цитата:

Цитата Iska
не знаете заранее, сколько времени понадобится для полной обработки? »

Это то да... Но я думал немного о другом принципе. Прошла, к примеру секунда или 10 секунд и прогресс бар на какую-то долю заполнился. Полоска дошла до конца, а скрипт ещё работает (секундомер считает) - полоска прогресс бара пошла по-новой, сначала.
Это конечно не будет классическим прогресс баром, но хоть какая-то информация.

YuS_2 31-10-2020 21:43 2938339

Цитата:

Цитата Uragan66
Хотелось бы что-то универсальное. »

Универсальным может быть только вот такой, "бесконечный" прогрессбар...

Цитата:

Цитата Uragan66
полоска прогресс бара пошла по-новой, сначала.
Это конечно не будет классическим прогресс баром, но хоть какая-то информация. »

это, как раз, и реализовано в скрипте выше, но такой прогрессбар не имеет смысла, только лишь для визуализации процесса работы...

Iska 01-11-2020 02:54 2938353

Цитата:

Цитата Uragan66
Это конечно не будет классическим прогресс баром, но хоть какая-то информация. »

Ну, это точно не прогресс-бар.

Самое простое — вывод точки, одной, второй, третьей и т.д. Либо банальный вывод времени.


Время: 13:18.

Время: 13:18.
© OSzone.net 2001-