Войти

Показать полную графическую версию : [решено] Прошу помощи с доработкой скрипта таймера


blacks2
22-11-2020, 00:44
Здравствуйте.
Приношу свои извинения за беспокойство.
Возник вопрос, проблема:


На форуме нашел скрипт таймера,
Скрипт отличный! Применяю для замера времени выполнения скрипта.
(архивация, разархивация, копирование, сканирование)

Но то работает, то криво...
Оказалось, когда время в часах, в системе обозначены двухзначным числом (10-23часов) скрипт работает!
Ежели запуск происходит ночью-утром, где часы измеряются одним числом (0-9 часов)
то...

Например, если процесс замера попал на смену утренних часов 06.40.29--7:04:43
результат выводиться как = 0:-35:-50 (минусы)
...также бывают ошибки в виде результата в 1-5секунд, вместо более часовой работы скрипта
(скорее по той же причине).


Прошу помощи:
Помогите с доработкой/решением что бы исправить вышеобозначенный баг.


Заранее всем откликнувшимся БОЛЬШОЕ СПАСИБО!



SetLocal enabledelayedexpansion


:: сниппет не относится к вопросу-скрипту, но применется в сборке
:: оставил его здесь, вдруг ошибка может быть из-за него
set dd=%DATE%
set tt=%TIME%
set /a ddd=%dd:~0,2%
IF %ddd% LSS 10 (
SET day=0%ddd%) else (
SET day=%ddd%)
set month=%dd:~3,2%
set year=%dd:~6,4%
set /a ttt=%tt:~0,2%
IF %ttt% LSS 10 (
SET hour=0%ttt%) else (
SET hour=%ttt%)
SET minute=%tt:~3,2%
SET sec=%tt:~6,2%
SET datetimef=%year%.%month%.%day%
SET datetimef_m=%year%.%month%.%day%_%hour%.%minute%
SET datetimef_s=%year%.%month%.%day%_%hour%.%minute%.%sec%
SET datetimef_hms=%hour%.%minute%.%sec%
SET ttm1=%time:~,-3%
:: // конец сниппета




:: применение скрипта
call :SectorSRT
7z...
call :SectorEnd
echo Final time: %worktime_HH%:%worktime_MM%:%worktime_SS%
echo Pause
pause



:: собственно сам скрипт
:SectorSRT
set tstart=%time%
set begin_HH=1%time:~0,2%
set /a begin_HH=%begin_HH%-100
set begin_MM=1%time:~3,2%
set /a begin_MM=%begin_MM%-100
set begin_SS=1%time:~6,2%
set /a begin_SS=%begin_SS%-100
goto :EOF

:SectorEnd
set end_HH=1%time:~0,2%
set /a end_HH=%end_HH%-100
set end_MM=1%time:~3,2%
set /a end_MM=%end_MM%-100
set end_SS=1%time:~6,2%
set /a end_SS=%end_SS%-100
set /a begin=(%begin_HH%*3600)+(%begin_MM%*60)+%begin_SS%
set /a end=(%end_HH%*3600)+(%end_MM%*60)+%end_SS%
set /a worktime=%end%-%begin%

set /a worktime_MM=%worktime%/60
set /a worktime_SS=%worktime%-%worktime_MM%*60
set /a worktime_HH=%worktime_MM%/60
goto :EOF

Iska
22-11-2020, 00:48
blacks2, переходите на WSH/PoSH, где не требуются подобные извращения для работы с датой/временем в принципе.

kjuoky
22-11-2020, 02:33
Тут проблема что время берётся из непродуманной переменной %тайм%.
Возьми патентованный запрос к вмик от Мегаломана и будет тебе счастье.
call :CurrentTimeDate

echo %var%

:CurrentTimeDate
for /f "tokens=2 delims==." %%a in ('wmic os get localdatetime /value') do set "n=%%a"
set var=[%n:~0,4%_%n:~4,2%_%n:~6,2%-%n:~8,2%_%n:~10,2%_%n:~12,2%]
goto :eof

Uragan66
22-11-2020, 09:45
переходите на WSH/PoSH, где не требуются подобные извращения для работы с датой/временем в принципе »
да и "скрипт таймера" на PoSH совсем простой:
$watch = [System.Diagnostics.Stopwatch]::StartNew()
$watch.Start()

Ваш скрипт

$watch.Stop()
$watch.Elapsed

Vadikan
22-11-2020, 10:58
Даже скрипт не нужен, есть Measure-Command https://docs.microsoft.com/powershell/module/microsoft.powershell.utility/measure-command

blacks2
22-11-2020, 12:05
переходите на WSH/PoSH, где не требуются подобные извращения для работы с датой/временем в принципе. »

Благодарю Iska

Данные термины мне пока ни о чем не говорят (не проггер/системщик)
Погуглю, а после нужно будет поискать решение к таймеру.




Тут проблема что время берётся из непродуманной переменной %тайм%.
Возьми патентованный запрос к вмик от Мегаломана и будет тебе счастье. »

Спасибо за разъяснение причины проблем kjuoky
И за пример!

Попробую методом тыка (не проггер) добавить в сборку и протестировать
Позже отпишусь.




да и "скрипт таймера" на PoSH совсем простой: »

Вау, класс - спасибо за пример Uragan66!
Буду пробовать в сборке.
По результатом отпишусь что выбрал.


* погуглил, посмотрел бегло, понял: ведь то PowerShell (видимо то самое PoSH),
но я в нем вообще не силен (ранее ниже, в ответе Vadikan описал) так, что даже
не знаю как вывести полученные данные в echo внутри CMD, да и сам PoSH запустить внутри CMD =(((
(домашняя сборка скрипта, для тестирования вариантов времени/размера бекапа и вывода результата в лог)




Даже скрипт не нужен, есть Measure-Command https://docs.microsoft.com/powershel...easure-command »

Спасибо Vadikan!
Но я пока в PowerShell совсем ньюб,
даже не знаю как вызвать внутри CMD запуск PS,
передать в него и из него, в CMD переменные, для последующей обработки-отображения.

Поэтому снипеттами собираю что найду/пойму

* собираемый скрипт нужен просто для себя:
произвести тест скорости бекапа оптимальные для моей домашней системы на время/сжатие, вывести в лог

Vadikan
22-11-2020, 12:31
Но я пока в PowerShell совсем ньюб,
даже не знаю как вызвать внутри CMD запуск PS,
передать в него и из него, в CMD переменные, для последующей обработки-отображения. »
Хороший повод освоить на практической задаче и обойтись без cmd.

А так...
archive.cmd
7z a C:\test\archive.zip C:\temp
PowerShell
Measure-Command {C:\temp\archive.cmd}


Days : 0
Hours : 0
Minutes : 0
Seconds : 4
Milliseconds : 531
Ticks : 45311549
TotalDays : 5,24439224537037E-05
TotalHours : 0,00125865413888889
TotalMinutes : 0,0755192483333333
TotalSeconds : 4,5311549
TotalMilliseconds : 4531,1549

(Measure-Command {C:\temp\archive.cmd}).TotalSeconds
4,3372724

megaloman
22-11-2020, 16:07
@set @E=1; /*

@Echo Off
cls
rem Начало измерения интервала
FOR /F "usebackq tokens=1,2 delims= " %%i IN (`Cscript //NoLogo /E:jscript "%~dpnx0" 0`) DO Set "Out=%%i"

rem === здесь код, время исполнения которого контролируем
rem timeout /T 7
pause
rem ===

rem Конец измерения интервала
FOR /F "usebackq tokens=1,2,3 delims= " %%i IN (`Cscript //NoLogo /E:jscript "%~dpnx0" %Out%`) DO Set "Out=%%i" &Set "TDel=%%j" &Set "TTime=%%k"

Echo %Out% %TDel% %TTime%
Pause
Exit /B

*/
//Приходит начальное время (мсек с полуночи 1 янв 1970)
var oArg = WScript.Arguments;

var d = new Date();
var dnew = d.getTime();
var delta = Math.round((dnew-oArg(0))/1000);
var allSec = delta;
//var nDay = Math.floor(delta/86400); delta = delta-nDay*86400;
var nHour = Math.floor(delta/3600); delta = delta-nHour*3600;
var nMinutes = Math.floor(delta/60); delta = delta-nMinutes*60;
var nSec = delta;

// На выходе текущее время (мсек с полуночи 1 янв 1970)
// текущее-начальное (сек)
// текущее-начальное (часы.мм.cc)

nMinutes = nMinutes+1000+" "; nSec = nSec+1000+" ";
WScript.Echo(dnew,allSec,nHour+"."+nMinutes.substr(2,2)+"."+nSec.substr(2,2));

blacks2
22-11-2020, 17:22
ОБРАЩЕНИЕ ОБЩЕЕ:

call :CurrentTimeDate
echo. >> log_timerecho.txt
echo %timerecho% >> log_timerecho.txt
7za a -ssw -mx0 -r0 -p%zipps% -mhc=on -mhe=on "%destination%\zip_kjuoky.7z" "%src_bkup%\"
call :CurrentTimeDateFINALE
echo %timerechoFINAL% >> log_timerecho.txt
echo pause
PAUSE >nul


:CurrentTimeDate
for /f "tokens=2 delims==." %%a in ('wmic os get localdatetime /value') do set "n=%%a"
:: формат 13.3.2012 6:30
set timerecho=[%n:~0,4%.%n:~4,2%.%n:~6,2% %n:~8,2%:%n:~10,2%]
goto :eof

:CurrentTimeDateFINALE
for /f "tokens=2 delims==." %%a in ('wmic os get localdatetime /value') do set "n=%%a"
set timerecho=[%n:~0,4%.%n:~4,2%.%n:~6,2% %n:~8,2%:%n:~10,2%]
goto :eof
Как понимаю отлично работает с формированием времени нежели %time%
Решение видимо хорошее. А вот анализ времени работы скрипта возможен по «костылю-расчету в Exel»:
(может кому пригодиться)

1. получаем дату и время старта/финала в log.csv = 13.3.2012 6:30 / 13.3.2012 7:30
2. далее в каждом новом логе...
в exel, ручками, по каждой строке создаем итог-формулу: «13.3.2012 6:30-13.3.2012 7:30» (минус)
+ ПКМ: формат ячеек-числовые форматы-все форматы... "[ч]:мм"




ОБРАЩЕНИЕ К Vadikan

Measure-Command »

1. получается вызов из PowerShell необходимо будет делать так:
Measure-Command {C:\temp\archive_v01.cmd}
Measure-Command {C:\temp\archive_v02.cmd}

Measure-Command {C:\temp\archive_v20.cmd}

Вместо цикла прописанного в CMD в текущем варианте, будет 20-30 файлов cmd…
(для xcopy, robocopy, 7zip, rar… подставляются значения настроек в виде переменных
и отправляются на цикл с фиксацией времени исполнения, старта, финиша, размера…)



2. Приведенный вами пример и немедленное несколько часов изучения PowerShell родили такую строку:

Measure-Command {start-sleep 10} |select @{n="time";e={$_.Hours,$_.Minutes,$_.Seconds,$_.Milliseconds -join ":"}} >> "t:\log_Measure3.txt"

Резултат:
time
----
0:0:10:3

Как убрать «time» и «----» так и не понял 0=(
Метод тыка не помог….



К тому, нужно еще как-то получить:
- время начала работы скрипта архивации
- время финала работы скрипта архивации

После собрать переменные из уже написанного cmd и вывести все в одну строку лога CSV:
- номер
- название
- переменную размера полученного бекапа
- переменную % сжатия относительно папки-источника
- время работы скрипта архивации (Measure-Command)
- время начала работы скрипта архивации
- время финала работы скрипта архивации

Что бы в логе CSV получилась одна строка, разделенная «;»
А после нее следущая строка - с новым вариантом…

Все то работает в уже готовом CMD, окромя подсчета на процесс в ночное время (тема топика)
А как все это реализовать в чистом PowerShell /+CMD -- не имею понятия
Время на изучение-написание наверно выйдет куда более ручного/кастыльного




*
«Хороший повод освоить на практической задаче и обойтись без cmd»

но наверное в моем случае не логично:
протестировать 20-30 вариантов бекапов на 2-3х машинах / и изучить PowerShell
= 40-60 вариантов можно ручками с секундомером = сутки/2 дня
- а изучить PowerShell = времени поболее думаю

понимаю, то рост, опыт, знания =)…
к сожалению сейчас очень ограничен в времени.
сейчас PowerShell мне = как бабушке HTML с нуля

Готового решения не нахожу =(




ОБРАЩЕНИЕ К Megaloman
Код.. »


Обрадовался вновь вам уважаемый megaloman
Думал «Чудо! Вот оно! Готовое решение!» :o :cry:
Скопировал, расскоментировал timeout /T 7 поменяв на 125


Результат:
1606000571219 184 0.03.04
Для продолжения нажмите любую клавишу . . .


к сожалинию, моих знаний не хватает понять:
- где и как 125сек = 1606000571219 184 0.03.04
- %Out% %TDel% %TTime%

+ в CH866 не работает, только в UTF-8


Подскажите пожалуйста, что не так?
Спасибо!

megaloman
22-11-2020, 17:49
blacks2, + в CH866 не работает, только в UTF-8 »Не верю!Приложил файл, уберите расширение txt. Подозреваю, раскомментировав timeout, за ним не закомментировали pause. Потому и время шло лишнее. Тут уж или крестик, или трусы.
1606056755388 125 0.02.05
1606056755388 это время Вам не нужно, оно нужно для корректного измерения интервала (в скрипте описано), например, следующего куска кода. Эта цифирь идёт на вход js-скрипта. Я её выдал ради интереса.
125 - это секунды между двумя замерами.
0.02.05 - это нуль часов две минуты 5 секунд между двумя замерами.
Что надо, то и печатайте.
Соответственно у Вас 184сек= нуль часов три минуты четыре секунды

Vadikan
22-11-2020, 18:59
получается вызов из PowerShell необходимо будет делать так:
...
Вместо цикла прописанного в CMD в текущем варианте, будет 20-30 файлов cmd… »
Ну зачем же так в лоб воспринимать.
measure {
команды/батники
}
measure {
команда
}

Приведенный вами пример и немедленное несколько часов изучения PowerShell родили такую строку: »
Что-то сложное они родили. Вот в минутах с округлением до двух знаков
[math]::Round((Measure-Command {start-sleep 10}).TotalMinutes,2)
0,17

Время на изучение-написание наверно выйдет куда более ручного/кастыльного »
Конечно, как всегда бывает с чем-то новым. Но в этот раз, а в следующий - уже нет.

blacks2
22-11-2020, 19:04
Не верю!Приложил файл, уберите расширение txt. »

1.
и я не верил… а сейчас...
верю и не верю:
запустил ваш - работает
запустил "свой" - работает
в своем из uts8-866 перекодировал - работает

что было - не понял. ппц =)


2.
"Подозреваю, раскомментировав timeout, за ним не закомментировали pause." - megaloman
- так точно!
- одновременно с редакцией вашего поста то понял

Спасибо!!


4.
в присланном вами примере (txt)
заметил, что добавилась 3йка, в строке:

FOR /F "usebackq tokens=1,2,3 delims= " %%i IN (`Cscript //NoLogo /E:jscript "%~dpnx0" 0`) DO Set "Out=%%i"

ранее было tokens=1,2

Подскажите пожалуйста, как правильней
Так как я ни "бум-бум" что есть tokens=

Огромное вам СПАСИБО megaloman!!!



ПС
Думаю, надеюсь:

Взяв ваше megaloman решение, на подсчет затраченного времени
И решение от kjuoky на отображение точного времени:
:CurrentTimeDate
for /f "tokens=2 delims==." %%a in ('wmic os get localdatetime /value') do set "n=%%a"
set timerecho=[%n:~0,4%.%n:~4,2%.%n:~6,2% %n:~8,2%:%n:~10,2%]
goto :eof

- получится железобетонное для новичка решение

Конечно, как всегда бывает с чем-то новым. Но в этот раз, а в следующий - уже нет. »
Прочел ваш ответ. Благодарю.
Попозже сегодня поподробнее посмотрю что смогу расковырять
на основе ваших направлений к изучению

Да, про опыт вы верно сказали.
Тоже самое было вначале с CMD =) :bow:

megaloman
22-11-2020, 19:22
ранее было tokens=1,2 »В той строке вообще можно обойтись без tokens=....
Я просто унифицировал обе строки.
В последующих For через пробел js выдаёт три величины// На выходе текущее время (мсек с полуночи 1 янв 1970)
// текущее-начальное (сек)
// текущее-начальное (часы.мм.cc) » В For они последовательно попадают в переменные цикла %%i %%j %%k, которые соответственно присваиваются переменным %Out% %TDel% %TTime%

blacks2
22-11-2020, 19:49
В For они последовательно попадают в переменные цикла »
Спасибо.

blacks2
24-11-2020, 22:31
Тут проблема что время берётся из непродуманной переменной %тайм%. »
Я просто унифицировал обе строки. »
Ну зачем же так в лоб воспринимать. »

kjuoky
megaloman
Vadikan

Благодарю вас за помощь и советы!
Собрал - заработало.


ps
тема топика решена




© OSzone.net 2001-2012