Показать полную графическую версию : [решено] сравнение дат
Доброго времени суток.
Как в батнике сравнить даты?
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 - греп :laugh:
Может я не в том формате подаю даты? Но ECHO %DATE% выдает дату именно в таком же формате.
ЕЯПП то так делать ненадо. Берут дату unix_time и уже с ней играются.
т.е. брать дату в unix_time (https://www.unixtimestamp.com/), сравнивать и перед выводом, перестраивать в "человеческий формат".
Сравнишь секунды, дальше преобразуешь в читаемый формат. получить unix_time в Windows можно просто так:
(отсюда пример https://stackoverflow.com/questions/11385030/batch-timestamp-to-unix-time )
@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 (https://www.cygwin.com
/) (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
Осталось собрать воедино :)
Берут дату unix_time и уже с ней играются.
этого я и боялся :cry:
может на powershell можно даты сравнить попроще? я просто с ним на вы мягко говоря
хотя unix-вый date я зря не вспомнил, спасибо!
может на powershell можно даты сравнить попроще? я просто с ним на вы мягко говоря »
как и мы, многие... может и можно там. Подожди, ребята отпишутся возможно... почти уверен что можно, но хз. M$ в крайние годы ваще не вдохновляет. Вот совсем.
DJ Mogarych
30-05-2022, 23:02
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 дней)
Положительные значения подсвечиваются зелёным, отрицательные - красным. Не знаю, как здесь их выделить.
megaloman
31-05-2022, 00:05
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
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! ?
megaloman
31-05-2022, 18:40
{red}%cur_date%{#}{\n} »-это грабли. Надо
{red}!cur_date!{#}{\n} или (судя по представленному коду):
{red}%%b{#}{\n} а можно ли развернуть %%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 Естественно, не тестировал
спасибо, все получилось
может кому пригодится: батник проходится по всем ключевым контейнерам из всех доступных ключевых носителей, сверяется дата, и если текущая дата больше крайней даты действия контейнера - контейнер удаляется.
для работы батника требуются установленное криптопро, linux-вый греп, cecho.exe (https://github.com/lordmulder/cecho/releases/download/2015-10-10/cecho.2015-10-10.zip)(опционально, для красоты).
использовать с осторожностью!
@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
DJ Mogarych
01-06-2022, 17:35
Столько костылей, только бы не использовать современные командные оболочки...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.