Компьютерный форум 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=347094)

blacks2 22-11-2020 00:44 2940675

Прошу помощи с доработкой скрипта таймера
 
Здравствуйте.
Приношу свои извинения за беспокойство.
Возник вопрос, проблема:


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

Но то работает, то криво...
Оказалось, когда время в часах, в системе обозначены двухзначным числом (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 2940676

blacks2, переходите на WSH/PoSH, где не требуются подобные извращения для работы с датой/временем в принципе.

kjuoky 22-11-2020 02:33 2940678

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

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 2940682

Цитата:

Цитата Iska
переходите на WSH/PoSH, где не требуются подобные извращения для работы с датой/временем в принципе »

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

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


Vadikan 22-11-2020 10:58 2940686

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

blacks2 22-11-2020 12:05 2940689

Цитата:

Цитата Iska
переходите на WSH/PoSH, где не требуются подобные извращения для работы с датой/временем в принципе. »

Благодарю Iska

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




Цитата:

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

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

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




Цитата:

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

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


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





Цитата:

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

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

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

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

Vadikan 22-11-2020 12:31 2940696

Цитата:

Цитата blacks2
Но я пока в 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 2940716

Код:

@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 2940718

ОБРАЩЕНИЕ ОБЩЕЕ:

Sript_by_kjuoky
Код:

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

Цитата:

Цитата 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
Код.. »


Обрадовался вновь вам уважаемый 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 2940721

Вложений: 1
blacks2,
Цитата:

Цитата 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 2940726

Цитата:

Цитата blacks2
получается вызов из PowerShell необходимо будет делать так:
...
Вместо цикла прописанного в CMD в текущем варианте, будет 20-30 файлов cmd… »

Ну зачем же так в лоб воспринимать.
Код:

measure {
команды/батники
}
measure {
команда
}

Цитата:

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

Что-то сложное они родили. Вот в минутах с округлением до двух знаков
Код:

[math]::Round((Measure-Command {start-sleep 10}).TotalMinutes,2)
0,17

Цитата:

Цитата blacks2
Время на изучение-написание наверно выйдет куда более ручного/кастыльного »

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

blacks2 22-11-2020 19:04 2940728

Цитата:

Цитата megaloman
Не верю!Приложил файл, уберите расширение 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

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


Цитата:

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

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

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

megaloman 22-11-2020 19:22 2940730

Цитата:

Цитата blacks2
ранее было tokens=1,2 »

В той строке вообще можно обойтись без tokens=....
Я просто унифицировал обе строки.
В последующих For через пробел js выдаёт три величины
Цитата:

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

В For они последовательно попадают в переменные цикла %%i %%j %%k, которые соответственно присваиваются переменным %Out% %TDel% %TTime%

blacks2 22-11-2020 19:49 2940733

Цитата:

Цитата megaloman
В For они последовательно попадают в переменные цикла »

Спасибо.

blacks2 24-11-2020 22:31 2940919

Цитата:

Цитата kjuoky
Тут проблема что время берётся из непродуманной переменной %тайм%. »

Цитата:

Цитата megaloman
Я просто унифицировал обе строки. »

Цитата:

Цитата Vadikan
Ну зачем же так в лоб воспринимать. »

kjuoky
megaloman
Vadikan


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


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


Время: 02:16.

Время: 02:16.
© OSzone.net 2001-