![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] сравнение дат |
|
CMD/BAT - [решено] сравнение дат
|
Пользователь Сообщения: 51 |
Доброго времени суток.
Как в батнике сравнить даты? cecho - консольная утилита для "цветного облагораживания" консоли. grep - греп ![]() Может я не в том формате подаю даты? Но ECHO %DATE% выдает дату именно в таком же формате. |
|
Отправлено: 16:43, 30-05-2022 |
Забанен Сообщения: 346
|
ЕЯПП то так делать ненадо. Берут дату 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 и получить читаемый вывод: - выше скрипт выдаст и через for берем первые до пробела цифры, сравниваем и дальше засылаем в date получаем: или... получаем Осталось собрать воедино ![]() |
Последний раз редактировалось wasp14, 30-05-2022 в 17:46. Отправлено: 17:38, 30-05-2022 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 51
|
Профиль | Отправить PM | Цитировать Цитата:
![]() хотя unix-вый date я зря не вспомнил, спасибо! |
|
Отправлено: 17:47, 30-05-2022 | #3 |
Забанен Сообщения: 346
|
Цитата nwss:
|
|
Отправлено: 20:59, 30-05-2022 | #4 |
fascinating rhythm Сообщения: 6705
|
Профиль | Отправить 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 дней) |
|
------- Отправлено: 23:02, 30-05-2022 | #5 |
Ветеран Сообщения: 2735
|
Профиль | Отправить 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
|
Профиль | Отправить 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 Синтаксическая ошибка в имени файла, имени папки или метке тома. помогите подрихтовать, пжлст. брал в скобки условие после if - тоже самое upd. а можно ли развернуть %%b так же как %DATE%? типо что-то вроде %%b:~-4%%b:~3,2%%b:~0,2! ? |
Последний раз редактировалось nwss, 31-05-2022 в 17:13. Отправлено: 16:32, 31-05-2022 | #7 |
Ветеран Сообщения: 2735
|
Профиль | Отправить PM | Цитировать Цитата nwss:
{red}!cur_date!{#}{\n} или (судя по представленному коду): {red}%%b{#}{\n} Цитата nwss:
Но я бы для читаемости сделал @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
|
Профиль | Отправить 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 |
fascinating rhythm Сообщения: 6705
|
Профиль | Отправить PM | Цитировать Столько костылей, только бы не использовать современные командные оболочки...
|
------- Отправлено: 17:35, 01-06-2022 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|