Имя пользователя:
Пароль:
 | Правила  

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

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

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


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

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


Доброго времени суток.
Как в батнике сравнить даты?
Что сделал
Код: Выделить весь код
cd "C:\Program Files (x86)\Crypto Pro\CSP"
for /f "tokens=* delims= skip=2" %%a in ('csptest -keys -enum -verifyco') do (
   cecho {0A}"%%a"{\n}{0B}
   for /f "usebackq tokens=*" %%b in (`csptest -keyset -container "%%a" ^| grep -Eo "[0-9]{2}\.[0-9]{2}\.[0-9]{4}"`) do (
      if %DATE% GEQ %%b cecho {white}%DATE% : {red}%%b{#}{\n}
      if %DATE% LSS %%b cecho {white}%DATE% : {green}%%b{#}{\n}
   )
)
pause

Вывод
Код: Выделить весь код
"ФИО 1112121634"
30.05.2022 : 11.02.2023
"ФИО 417150058"
30.05.2022 : 17.07.2021
"ОГРН ИНН"
30.05.2022 : 31.10.2021

Что хочу
чтобы сравнивал даты корректно!


cecho - консольная утилита для "цветного облагораживания" консоли. grep - греп

Может я не в том формате подаю даты? Но ECHO %DATE% выдает дату именно в таком же формате.

Отправлено: 16:43, 30-05-2022

 

Забанен


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

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


ЕЯПП то так делать ненадо. Берут дату unix_time и уже с ней играются.
т.е. брать дату в unix_time, сравнивать и перед выводом, перестраивать в "человеческий формат".

Сравнишь секунды, дальше преобразуешь в читаемый формат. получить unix_time в Windows можно просто так:
(отсюда пример https://stackoverflow.com/questions/...p-to-unix-time )
scrpit
Код: Выделить весь код
@echo off
setlocal
call :GetUnixTime UNIX_TIME
echo %UNIX_TIME% seconds have elapsed since 1970-01-01 00:00:00
goto :EOF

:GetUnixTime
setlocal enableextensions
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do (
    set %%x)
set /a z=(14-100%Month%%%100)/12, y=10000%Year%%%10000-z
set /a ut=y*365+y/4-y/100+y/400+(153*(100%Month%%%100+12*z-3)+2)/5+Day-719469
set /a ut=ut*86400+100%Hour%%%100*3600+100%Minute%%%100*60+100%Second%%%100
endlocal & set "%1=%ut%" & goto :EOF

... а вот вернуть в читаемый вид яхз. Но у тебя уже есть сторонняя утила, знач никаких сложностей заиметь еще парочку : just install Cygwin (which comes with a UNIX-like time command)

Там есть своя date полнофункциональная, куда можно заслать значение секунд unix_date и получить читаемый вывод:
- выше скрипт выдаст
Код: Выделить весь код
1653921171 seconds have elapsed since 1970-01-01 00:00:00
и через for берем первые до пробела цифры, сравниваем и дальше засылаем в date
Код: Выделить весь код
date -d@1396713472
получаем:
Код: Выделить весь код
Mon May 30 17:32:51     2022
или...
Код: Выделить весь код
date -d@1396713472 --iso
получаем
Код: Выделить весь код
2022-05-30
Осталось собрать воедино

Последний раз редактировалось wasp14, 30-05-2022 в 17:46.


Отправлено: 17:38, 30-05-2022 | #2



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

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


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


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

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


Цитата:
Берут дату unix_time и уже с ней играются.
этого я и боялся

может на powershell можно даты сравнить попроще? я просто с ним на вы мягко говоря
хотя unix-вый date я зря не вспомнил, спасибо!

Отправлено: 17:47, 30-05-2022 | #3


Забанен


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

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


Цитата nwss:
может на powershell можно даты сравнить попроще? я просто с ним на вы мягко говоря »
как и мы, многие... может и можно там. Подожди, ребята отпишутся возможно... почти уверен что можно, но хз. M$ в крайние годы ваще не вдохновляет. Вот совсем.

Отправлено: 20:59, 30-05-2022 | #4


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Powershell:
Код: Выделить весь код
$dates = "11.02.2023","17.07.2021","31.10.2021"
$today = (get-date).Date

$dates |% {
if (($date = $_ -as [datetime]) -gt $today) {$color = "green"} else {$color = "red"}
Write-Host -fore $color "$($date.toshortdatestring()): (Осталось $(($date - $today).TotalDays) дней)"
}

11.02.2023: (Осталось 257 дней)
17.07.2021: (Осталось -317 дней)
31.10.2021: (Осталось -211 дней)
Положительные значения подсвечиваются зелёным, отрицательные - красным. Не знаю, как здесь их выделить.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

Отправлено: 23:02, 30-05-2022 | #5


Ветеран


Contributor


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

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


nwss, Если Вам надо сравнить даты (не вычесть не прибавить) то довольно просто.
Если формат даты в системе ДД.ММ.ГГГГ, то сводим её в число ГГГГММДД, а сравнивать числа можно корректно.
Код: Выделить весь код
@Echo Off
cls
	Set "Date1=%Date%"
	Set "Date0=29.05.2022"
	Set "Date2=29.05.2023"

	If %Date1:~-4%%Date1:~3,2%%Date1:~0,2% GTR %Date0:~-4%%Date0:~3,2%%Date0:~0,2% (Echo %Date1%^>%Date0%) Else (Echo %Date1%^<=%Date0%)
	If %Date0:~-4%%Date0:~3,2%%Date0:~0,2% GTR %Date2:~-4%%Date2:~3,2%%Date2:~0,2% (Echo %Date0%^>%Date2%) Else (Echo %Date0%^<=%Date2%)
pause
Exit /B

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

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

Отправлено: 00:05, 31-05-2022 | #6


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


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

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


Код: Выделить весь код
setlocal EnableDelayedExpansion

cd "C:\Program Files (x86)\Crypto Pro\CSP"
for /f "tokens=* delims= skip=2" %%a in ('csptest -keys -enum -verifyco') do (
   cecho {0A}"%%a"{\n}{0B}
   for /f "usebackq tokens=*" %%b in (`csptest -keyset -container "%%a" ^| grep -Eo "[0-9]{2}\.[0-9]{2}\.[0-9]{4}"`) do (
      set cur_date=%%b
      echo %DATE:~-4%%DATE:~3,2%%DATE:~0,2% !cur_date:~-4!!cur_date:~3,2!!cur_date:~0,2!
      if %DATE:~-4%%DATE:~3,2%%DATE:~0,2% GEQ !cur_date:~-4!!cur_date:~3,2!!cur_date:~0,2! cecho {white}%DATE% : {red}%cur_date%{#}{\n}
      if %DATE:~-4%%DATE:~3,2%%DATE:~0,2% LSS !cur_date:~-4!!cur_date:~3,2!!cur_date:~0,2! cecho {white}%DATE% : {green}%%b{#}{\n}
   )
)
pause
выдает
Код: Выделить весь код
"ФИО 1216145855"
20220531 20230316
Синтаксическая ошибка в имени файла, имени папки или метке тома.
"ФИО 1639982775722"
20220531 20230320
Синтаксическая ошибка в имени файла, имени папки или метке тома.
почему в случае echo - выдает корректно, а в случае if - синтаксическая ошибка?
помогите подрихтовать, пжлст.
брал в скобки условие после if - тоже самое

upd. а можно ли развернуть %%b так же как %DATE%?
типо что-то вроде %%b:~-4%%b:~3,2%%b:~0,2! ?

Последний раз редактировалось nwss, 31-05-2022 в 17:13.


Отправлено: 16:32, 31-05-2022 | #7


Ветеран


Contributor


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

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


Цитата nwss:
{red}%cur_date%{#}{\n} »
-это грабли. Надо
{red}!cur_date!{#}{\n} или (судя по представленному коду):
{red}%%b{#}{\n}
Цитата nwss:
а можно ли развернуть %%b так же как %DATE% »
-нельзя.
Но я бы для читаемости сделал
Код: Выделить весь код
@Echo Off
cls
setlocal EnableDelayedExpansion
Set "DT=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%"

Pushd "C:\Program Files (x86)\Crypto Pro\CSP"

for /f "tokens=* delims= skip=2" %%a in ('csptest -keys -enum -verifyco') do (
	cecho {0A}"%%a"{\n}{0B}
	for /f "usebackq tokens=*" %%b in (`csptest -keyset -container "%%a" ^| grep -Eo "[0-9]{2}\.[0-9]{2}\.[0-9]{4}"`) do (
		set "cur_date=%%b"
		Set "cur_dt=!cur_date:~-4!!cur_date:~3,2!!cur_date:~0,2!"
		echo %DATE:~-4%%DATE:~3,2%%DATE:~0,2% !cur_dt!
		if %DT% GEQ !cur_dt! cecho {white}%DATE% : {red}%%b{#}{\n}
		if %DT% LSS !cur_dt! cecho {white}%DATE% : {green}%%b{#}{\n}
	)
)	
pause
Естественно, не тестировал

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

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

Отправлено: 18:40, 31-05-2022 | #8


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


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

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


спасибо, все получилось

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

для работы батника требуются установленное криптопро, linux-вый греп, cecho.exe(опционально, для красоты).

использовать с осторожностью!

Код: Выделить весь код
@echo off

rem LSS - меньше
rem LEQ - меньше или равно
rem GTR - больше
rem GEQ - больше или равно

setlocal EnableDelayedExpansion
cls
Set "DT=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%"

Pushd "C:\Program Files (x86)\Crypto Pro\CSP"
for /f "tokens=* delims= skip=2" %%a in ('csptest -keys -enum -verifyco') do (
   cecho {0A}"%%a"{\n}{0B}
   for /f "usebackq tokens=*" %%b in (`csptest -keyset -container "%%a" ^| grep -Eo "[0-9]{2}\.[0-9]{2}\.[0-9]{4}"`) do (
      set "cur_date=%%b"
      Set "cur_dt=!cur_date:~-4!!cur_date:~3,2!!cur_date:~0,2!"
      rem echo %DATE:~-4%%DATE:~3,2%%DATE:~0,2% !cur_dt!
      if %DT% GTR !cur_dt! (cecho {white}%DATE% : {red}%%b{#}{\n} && cecho {red}Удаляем{#}{\n} && csptest -keys -enum -verifyco -deletek -pattern "%%a")
      if %DT% LEQ !cur_dt! (cecho {white}%DATE% : {green}%%b{#}{\n} && cecho {yellow}Не удаляем{#}{\n})
   )
)
pause

Последний раз редактировалось nwss, 01-06-2022 в 14:15.


Отправлено: 14:10, 01-06-2022 | #9


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Столько костылей, только бы не использовать современные командные оболочки...

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

Отправлено: 17:35, 01-06-2022 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2010 - [решено] округление дат golovatov Microsoft Office (Word, Excel, Outlook и т.д.) 3 04-11-2015 20:33
2007 - Последовательность дат GalinaRiga Microsoft Office (Word, Excel, Outlook и т.д.) 2 28-08-2015 09:14
Delphi - Сравнение дат Radik_Assasin Программирование и базы данных 5 21-08-2011 13:49
Разница дат - скрипт Кощей Вебмастеру 1 23-10-2009 04:01
Delphi - Вычитание дат на Delphi d_voffka Программирование и базы данных 2 05-06-2006 11:53




 
Переход