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

nwss 30-05-2022 16:43 2985956

сравнение дат
 
Доброго времени суток.
Как в батнике сравнить даты?
Что сделал
Код:

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% выдает дату именно в таком же формате.

wasp14 30-05-2022 17:38 2985962

ЕЯПП то так делать ненадо. Берут дату 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
Осталось собрать воедино :)

nwss 30-05-2022 17:47 2985964

Цитата:

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

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

wasp14 30-05-2022 20:59 2985971

Цитата:

Цитата nwss
может на powershell можно даты сравнить попроще? я просто с ним на вы мягко говоря »

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

DJ Mogarych 30-05-2022 23:02 2985972

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 2985974

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


nwss 31-05-2022 16:32 2986011

Код:

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 2986017

Цитата:

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

Естественно, не тестировал

nwss 01-06-2022 14:10 2986060

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

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

для работы батника требуются установленное криптопро, 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


DJ Mogarych 01-06-2022 17:35 2986067

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


Время: 23:49.

Время: 23:49.
© OSzone.net 2001-