Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Прошу помощи с доработкой скрипта таймера

Ответить
Настройки темы
CMD/BAT - [решено] Прошу помощи с доработкой скрипта таймера

Пользователь


Сообщения: 99
Благодарности: 2

Профиль | Отправить PM | Цитировать


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


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

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

Профиль | Отправить PM | Цитировать


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

Отправлено: 00:48, 22-11-2020 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 8
Благодарности: 1

Профиль | Отправить PM | Цитировать


Тут проблема что время берётся из непродуманной переменной %тайм%.
Возьми патентованный запрос к вмик от Мегаломана и будет тебе счастье.
Код: Выделить весь код
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
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:33, 22-11-2020 | #3


Старожил


Сообщения: 216
Благодарности: 15

Профиль | Отправить PM | Цитировать


Цитата Iska:
переходите на WSH/PoSH, где не требуются подобные извращения для работы с датой/временем в принципе »
да и "скрипт таймера" на PoSH совсем простой:
Код: Выделить весь код
     $watch = [System.Diagnostics.Stopwatch]::StartNew()
     $watch.Start()
 
     Ваш скрипт
 
     $watch.Stop()
     $watch.Elapsed
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:45, 22-11-2020 | #4


(*.*)


Сообщения: 36491
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


Даже скрипт не нужен, есть Measure-Command https://docs.microsoft.com/powershel...easure-command
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:58, 22-11-2020 | #5


Пользователь


Сообщения: 99
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата 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 переменные, для последующей обработки-отображения.

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

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

Последний раз редактировалось blacks2, 22-11-2020 в 12:24.


Отправлено: 12:05, 22-11-2020 | #6


(*.*)


Сообщения: 36491
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:31, 22-11-2020 | #7


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить 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
Благодарности: 2

Профиль | Отправить 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 »
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
Думал «Чудо! Вот оно! Готовое решение!»
Скопировал, расскоментировал timeout /T 7 поменяв на 125


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

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

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


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

Отправлено: 17:22, 22-11-2020 | #9


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt я201122.bat.txt
(1.2 Kb, 3 просмотров)

blacks2,
Цитата blacks2:
+ в CH866 не работает, только в UTF-8 »
Не верю!Приложил файл, уберите расширение txt. Подозреваю, раскомментировав timeout, за ним не закомментировали pause. Потому и время шло лишнее. Тут уж или крестик, или трусы.
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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Прошу помощи с доработкой скрипта таймера

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
ПРОШУ ПОМОЩИ! 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




 
Переход