|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Прошу помощи с доработкой скрипта таймера |
|
|
CMD/BAT - [решено] Прошу помощи с доработкой скрипта таймера
|
Пользователь Сообщения: 99 |
Профиль | Отправить PM | Цитировать
Здравствуйте.
Приношу свои извинения за беспокойство. Возник вопрос, проблема: На форуме нашел скрипт таймера, Скрипт отличный! Применяю для замера времени выполнения скрипта. (архивация, разархивация, копирование, сканирование) Но то работает, то криво... Оказалось, когда время в часах, в системе обозначены двухзначным числом (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 |
|
Отправлено: 00:44, 22-11-2020 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать blacks2, переходите на WSH/PoSH, где не требуются подобные извращения для работы с датой/временем в принципе.
|
Отправлено: 00:48, 22-11-2020 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 8
|
Профиль | Отправить PM | Цитировать Тут проблема что время берётся из непродуманной переменной %тайм%.
Возьми патентованный запрос к вмик от Мегаломана и будет тебе счастье. |
Отправлено: 02:33, 22-11-2020 | #3 |
Старожил Сообщения: 216
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
Отправлено: 09:45, 22-11-2020 | #4 |
(*.*) Сообщения: 36491
|
Профиль | Сайт | Отправить PM | Цитировать Даже скрипт не нужен, есть Measure-Command https://docs.microsoft.com/powershel...easure-command
|
|
Отправлено: 10:58, 22-11-2020 | #5 |
Пользователь Сообщения: 99
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Данные термины мне пока ни о чем не говорят (не проггер/системщик) Погуглю, а после нужно будет поискать решение к таймеру. Цитата kjuoky:
И за пример! Попробую методом тыка (не проггер) добавить в сборку и протестировать Позже отпишусь. Цитата Uragan66:
Буду пробовать в сборке. По результатом отпишусь что выбрал. * погуглил, посмотрел бегло, понял: ведь то PowerShell (видимо то самое PoSH), но я в нем вообще не силен (ранее ниже, в ответе Vadikan описал) так, что даже не знаю как вывести полученные данные в echo внутри CMD, да и сам PoSH запустить внутри CMD =((( (домашняя сборка скрипта, для тестирования вариантов времени/размера бекапа и вывода результата в лог) Цитата Vadikan:
Но я пока в PowerShell совсем ньюб, даже не знаю как вызвать внутри CMD запуск PS, передать в него и из него, в CMD переменные, для последующей обработки-отображения. Поэтому снипеттами собираю что найду/пойму * собираемый скрипт нужен просто для себя: произвести тест скорости бекапа оптимальные для моей домашней системы на время/сжатие, вывести в лог |
||||
Последний раз редактировалось blacks2, 22-11-2020 в 12:24. Отправлено: 12:05, 22-11-2020 | #6 |
(*.*) Сообщения: 36491
|
Профиль | Сайт | Отправить PM | Цитировать Цитата blacks2:
А так... archive.cmd 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 |
|
------- Отправлено: 12:31, 22-11-2020 | #7 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать @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)); |
------- Отправлено: 16:07, 22-11-2020 | #8 |
Пользователь Сообщения: 99
|
Профиль | Отправить PM | Цитировать ОБРАЩЕНИЕ ОБЩЕЕ:
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 {C:\temp\archive_v01.cmd} Measure-Command {C:\temp\archive_v02.cmd} … Measure-Command {C:\temp\archive_v20.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=( Метод тыка не помог…. К тому, нужно еще как-то получить: - время начала работы скрипта архивации - время финала работы скрипта архивации После собрать переменные из уже написанного cmd и вывести все в одну строку лога CSV: - номер - название - переменную размера полученного бекапа - переменную % сжатия относительно папки-источника - время работы скрипта архивации (Measure-Command) - время начала работы скрипта архивации - время финала работы скрипта архивации Что бы в логе CSV получилась одна строка, разделенная «;» А после нее следущая строка - с новым вариантом… Все то работает в уже готовом CMD, окромя подсчета на процесс в ночное время (тема топика) А как все это реализовать в чистом PowerShell /+CMD -- не имею понятия Время на изучение-написание наверно выйдет куда более ручного/кастыльного * «Хороший повод освоить на практической задаче и обойтись без cmd» но наверное в моем случае не логично: протестировать 20-30 вариантов бекапов на 2-3х машинах / и изучить PowerShell = 40-60 вариантов можно ручками с секундомером = сутки/2 дня - а изучить PowerShell = времени поболее думаю понимаю, то рост, опыт, знания … к сожалению сейчас очень ограничен в времени. сейчас PowerShell мне = как бабушке HTML с нуля Готового решения не нахожу =( ОБРАЩЕНИЕ К Megaloman Цитата megaloman:
Обрадовался вновь вам уважаемый megaloman Думал «Чудо! Вот оно! Готовое решение!» Скопировал, расскоментировал timeout /T 7 поменяв на 125 Результат: к сожалинию, моих знаний не хватает понять: - где и как 125сек = 1606000571219 184 0.03.04 - %Out% %TDel% %TTime% + в CH866 не работает, только в UTF-8 Подскажите пожалуйста, что не так? Спасибо! |
||
Отправлено: 17:22, 22-11-2020 | #9 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать blacks2,
Цитата blacks2:
1606056755388 125 0.02.05 1606056755388 это время Вам не нужно, оно нужно для корректного измерения интервала (в скрипте описано), например, следующего куска кода. Эта цифирь идёт на вход js-скрипта. Я её выдал ради интереса. 125 - это секунды между двумя замерами. 0.02.05 - это нуль часов две минуты 5 секунд между двумя замерами. Что надо, то и печатайте. Соответственно у Вас 184сек= нуль часов три минуты четыре секунды |
|
------- Последний раз редактировалось megaloman, 22-11-2020 в 18:08. Отправлено: 17:49, 22-11-2020 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
ПРОШУ ПОМОЩИ! | tolj1937 | Тест-форум | 0 | 06-02-2015 22:30 | |
Разное - Прошу помощи | renzik | Тест-форум | 0 | 19-01-2014 01:42 | |
Прошу помощи... | Владимир_Небылица@vk | Лечение систем от вредоносных программ | 8 | 05-03-2012 13:27 | |
Разное - прошу помощи | shrek27 | Тест-форум | 4 | 28-02-2010 11:34 | |
Прошу о помощи!!! | Gor2 | Хочу все знать | 7 | 15-11-2002 22:07 |
|