Показать полную графическую версию : Совместить секундомер и прогресс бар
Uragan66
31-10-2020, 12:06
Доброго времени суток всем!
Некоторые скрипты работают довольно длительное время. Чтобы как-то контролировать процесс, можно было бы добавлять прогресс бар. Но универсального решения нет и нужно в каждом скрипте мозговать другой код для добавления прогресс бара.
Есть простой секундомер для контроля времени работы скрипта:
$watch = [System.Diagnostics.Stopwatch]::StartNew()
$watch.Start()
Скрипт
$watch.Stop()
$watch.Elapsed
Возможно ли совместить его с прогресс баром? То есть скрипт запустился, секундомер начал отсчитывать время и пошла полоска прогресс бара. Может можно как-то данные для прогресс бара брать с этого секундомера?
Uragan66, нет. Прогресс-бар имеет смысл, когда известно начальное значение, конечное значение и хоть какие-то реперные точки.
Foreigner
31-10-2020, 14:43
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
Но работает вроде только в цикле »
Foreigner, да, такой код работает только, когда в коде есть цикл. Пишу скрипты для облегчения рутинной работы с плейлистами IPTV, а циклы, если и есть, то значений для прогресс бара недостаточно. Да и не весь код это будет.
нет. Прогресс-бар имеет смысл, когда известно начальное значение, конечное значение и хоть какие-то реперные точки »
жаль... что здесь не получится.
…для облегчения рутинной работы с плейлистами IPTV »
А что Вы с ними делаете?
Uragan66
31-10-2020, 15:59
А что Вы с ними делаете? »
Iska, да много чего... Например, удаление дубликатов каналов, добавление в плейлист различных директив (для распознавания каналов файлом телепрограммы, деления по группам и т.д.), сканирование потоков на валидность. Да и другие задачи, типа как создание того же плейлиста из ссылок... Многие из этих задач можно и в блокноте решить, но автоматизация + дальнейшее отправление на "облако", конечно же удобнее...
Uragan66, описанные вами задачи не выглядят сколько-нибудь тяжеловесными, чтобы хотя бы успеть заметить/увидеть прогресс-бар
Пишу скрипты для облегчения рутинной работы с плейлистами IPTV, а циклы, если и есть, то значений для прогресс бара недостаточно. Да и не весь код это будет. »
Чтобы сказать о том, что возможно, а что нет, необходимо таки увидеть скрипт...
описанные вами задачи не выглядят сколько-нибудь тяжеловесными »
зависит от размера плейлистов... а их иногда склеивают из нескольких и на выходе получают достаточно объемные текстовые файлы...
Uragan66
31-10-2020, 19:36
описанные вами задачи не выглядят сколько-нибудь тяжеловесными, чтобы хотя бы успеть заметить/увидеть прогресс-бар »
Задачи с текстовым содержимым плейлистов таки да, выполняются достаточно быстро. Но, к примеру, та же проверка потоков на работоспособность или какой-нить сканер занимают по времени 30-40 мин. и поболее. Всё зависит от объёмности плейлиста, как ниже правильно заметили.
Но вопрос то даже не в том, можно заметить движение прогресс бара или нет. Если в скрипте есть циклы, то можно прогресс бар добавить, но опять таки он будет работать не всё время выполнения скрипта... Да и для каждого скрипта нужно свой прогресс бар мудрить.
Поэтому и подумал о секундомере, чтобы с него как-то брать данные для прогресс бара и это было бы универсальным решением для любого скрипта.
Чтобы сказать о том, что возможно, а что нет, необходимо таки увидеть скрипт... »
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()
Прошу прощения, что не указываю автора, просто не помню где нашел этот код.
Работает с любым скриптом... Но неудобно с него запускать скрипты, лишнее окно и т.д. Да и сам прогресс бар просто движется непрерывно.
Тогда можно. Сначала считаем общее число каналов, это будет конечной точкой. Затем, в процессе поиска дубликатов/сканирования потоков на валидность/прочая, выводим текущее значение для прогресс-бара.
Поэтому и подумал о секундомере, чтобы с него как-то брать данные для прогресс бара и это было бы универсальным решением для любого скрипта. »
Отнюдь. Вы ведь не знаете заранее, сколько времени понадобится для полной обработки?
Uragan66
31-10-2020, 21:14
Сначала считаем общее число каналов, это будет конечной точкой. Затем, в процессе поиска дубликатов/сканирования потоков на валидность/прочая, выводим текущее значение для прогресс-бара »
Iska, спасибо! Задумка хорошая, может в каком-то скрипте попробую применить.
не знаете заранее, сколько времени понадобится для полной обработки? »
Это то да... Но я думал немного о другом принципе. Прошла, к примеру секунда или 10 секунд и прогресс бар на какую-то долю заполнился. Полоска дошла до конца, а скрипт ещё работает (секундомер считает) - полоска прогресс бара пошла по-новой, сначала.
Это конечно не будет классическим прогресс баром, но хоть какая-то информация.
Хотелось бы что-то универсальное. »
Универсальным может быть только вот такой, "бесконечный" прогрессбар...
полоска прогресс бара пошла по-новой, сначала.
Это конечно не будет классическим прогресс баром, но хоть какая-то информация. »
это, как раз, и реализовано в скрипте выше, но такой прогрессбар не имеет смысла, только лишь для визуализации процесса работы...
Это конечно не будет классическим прогресс баром, но хоть какая-то информация. »
Ну, это точно не прогресс-бар.
Самое простое — вывод точки, одной, второй, третьей и т.д. Либо банальный вывод времени.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.