Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Автоматическая установка Windows 2000/XP/2003 (http://forum.oszone.net/forumdisplay.php?f=32)
-   -   [решено] Как сделать,что б батник проверял число ? (http://forum.oszone.net/showthread.php?t=71179)

mitiya 12-09-2006 12:52 483841

Как сделать,что б батник проверял число ?
 
Нужно что б батник проверял больше сейчас определенной даты или нет.
Тут я вижу несколько проблем :
1 незнаю как вообше дату проверить
2 не знаю как определить больше сейчас орпределенной даты или нет.
Ведь число может быть и меньше,а месяц следующий,или даже год

ShaddyR 12-09-2006 13:30 483849

Ничего сложного нет:
Код:

@echo off
if /i '%date%' GTR '12.11.2006' goto 2
echo меньше
goto end

:2
echo больше


:end
pause
exit

Ессно, число надо задавать руками, в формате, установленном системой.

amel27 12-09-2006 16:56 483967

mitiya
в дополнение к ShaddyR - как присвоить значение текущей даты переменной date:
Код:

For /F "Tokens=1* Delims= " %%i In ('Date /T') DO Set date=%%i
P.S. Параметры локализации можно взять из реестра - iDate и sDate ветки "HKCU\Control Panel\International"

ShaddyR 12-09-2006 17:02 483969

amel27: а зачем это может пригодиться? Честно - вообще не понял смысла... date и так содержит текущую дату... собсно, она не переменная, а внутренняя команда дос..

NikLok 12-09-2006 17:10 483973

Нука корифеи винШелла - как красиво взять дату у файла или директории? Ну потом соотв их запихнуть в переменной для сравнения.

nj_ 12-09-2006 17:14 483975

А как взять дату установки винди?

mitiya 12-09-2006 17:15 483977

ShaddyR

этот код правда выдает что сейчас меньше 12.09.2006 ,а сейчас равно 12.09.2006 :-)

но все понятно.

Спасибо.

amel27 12-09-2006 18:15 484001

ShaddyR
чтобы зная разделитель и порядок парсить строку независимо от локали

NikLok
Код:

If Exist %file% For %%i In (%file%) Do SET TIMESTAMP=%%~ti
для директории аналогично, ессно с указанием пути

nj_
можно таким же порядком - по дате файла %SYSTEMROOT%\setupact.log

ShaddyR 12-09-2006 18:32 484009

mitiya: Ну, главное ведь - идея, остальное нарастет ;). ю а велкам. (с) Timsky
(Используй оператор сравнения GEQ вместо GTR, будет равно) )

nj_ 13-09-2006 11:26 484329

Цитата:

можно таким же порядком - по дате файла %SYSTEMROOT%\setupact.
а как дату файла витенуть?

ShaddyR 13-09-2006 18:23 484501

nj_: озвучу, раз аналогия не понята ;)
Код:

set file=%SYSTEMROOT%\setupact.log
If Exist %file% For %%i In (%file%) Do SET TIMESTAMP=%%~ti
echo %timestamp%


nj_ 15-09-2006 22:58 485451

Провтикал аналогию :sorry:
Спасибо!

Ешо один глупий вопрос:
как присвоит переменной значение дати на n дней (месяцев) больше (меньше) текущей?

ShaddyR 18-10-2006 14:06 499535

nj_
Цитата:

как присвоит переменной значение дати на n дней (месяцев) больше (меньше) текущей?
я честно попытался решить этот вопрос... с учетом отсутствия в коммандном процессоре мат. операций. Все, что я нашел - это вот эта лабораторная работа, в которой среди прочего делается
Цитата:

Написание командного скрипта для вывода ряда фибоначи (т.е. где каждый последующий член ряда равен сумме двух предыдущих: 1, 1, 2, 3, 5, 8, 13, ...). Для этого будет использовано несколько пакетных файлов, работа с переменными окружения и тд.
Пару раз его перечитал и понял, шо я ничего не понял. Попробуй, мож у тебя лучше получится ;)

DarkTiger 18-10-2006 15:39 499588

Эммммм ребят, сори за офтоп, кто нибудь может поделиться своими источниками (будь то название книги, сылка на электронное издание, какие то статьи в инете и пр.) по написанию bat файлов. А то через поисковик ничего дельного не нашёл. Заранее спасибо за ответ

Sanja Alone 18-10-2006 16:14 499608

DarkTiger
Цитата:

поделиться своими источниками
Когда-то давно учился этому делу по книге Питера Нортона "MS-DOS" (точного названия не помню; помню, что в мягкой зеленой обложке была). Недавно обновил знания просто почитав C:\WINDOWS\Help\ntcmds.chm :)

amel27 19-10-2006 13:16 500026

ShaddyR
Цитата:

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

DarkTiger
из "избранного":
http://www.windowsfaq.ru/content/category/3/7/45
http://www.windowsfaq.ru/content/category/3/19/57/
http://www.microsoft.com/technet/pro.../FAQW2KCP.mspx
http://www.robvanderwoude.com/index.html :up:

DarkTiger 19-10-2006 18:30 500172

amel27 Огромное спасибо, уже читаю, написано на доступном языке, кроме последних 2 сылок, потому как англиский знаю плохо :(

amel27 20-10-2006 05:51 500342

Цитата:

как присвоит переменной значение дати на n дней (месяцев) больше (меньше) текущей?
Самый простой способ (и самый медленный) - итеративный цикл по количеству дней... Как и предупреждал, несколькими строчками кода не обошлось. Для ускорения расчетов можно было применить цикл по месяцам с выравниванием даты на последнем шаге, но тогда код стал бы еще более громоздким и плохо читаемым.
Код:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
Rem Параметры расчета: кол-во дней (>0!) и направление (+/-)
SET DAYS=730
SET SIGN=+
Rem Установка окружения и цикл расчета
CALL :GetDate
CALL :GetMnthDays
:Start
CALL :NextDay "%SIGN%1"
SET /A DAYS=%DAYS%-1
IF %DAYS% NEQ 0 GOTO :Start
Rem Вывод результата и завершение работы
CALL :ShowDate
EXIT
Rem Перемещение на следующий/предыдущий календарный день
:NextDay
SET /A Day=%Day%%~1
IF %Day% GTR !DOFW! (
        CALL :NextMonth +1
        CALL :GetMnthDays
        SET /A Day=1
)
IF %Day% EQU 0 (
        CALL :NextMonth -1
        CALL :GetMnthDays
        SET /A Day=!DOFW!
)
GOTO :EOF
Rem Расчет года и месяца, отстоящих от заданного
:NextMonth
SET /A MNDF=%Year%*12+%Month%%1
SET /A Year=(%MNDF%-1)/12
SET /A Month=%MNDF%-%Year%*12
GOTO :EOF
Rem Число дней в заданном месяце
:GetMnthDays
IF %Month% EQU 2 (
        CALL :IsYearVisok
        SET /A DOFW = 28+!VISOK!
) ELSE (
        SET NUM=0
        FOR %%i IN (31 28 31 30 31 30 31 31 30 31 30 31) DO (
                SET /A NUM=!NUM!+1
                IF %Month% EQU !NUM! (
                        SET DOFW=%%i
                        GOTO :EOF
                )
        )
)
GOTO :EOF
Rem Проверка года на високосность
:IsYearVisok
SET /A M1=%Year%-(%Year%/4)*4
SET /A M2=%Year%-(%Year%/100)*100
SET /A M3=%Year%-(%Year%/400)*400

SET VISOK=0
IF 0 EQU %M1% IF 0 NEQ %M2% SET VISOK=1
IF 0 EQU %M3% SET VISOK=1
GOTO :EOF
Rem Чтение текущей даты в переменные окружения
:GetDate
FOR /F "tokens=1,3" %%i IN ('REG QUERY "HKCU\Control Panel\International" /s^|findstr /C:"iDate" /C:"sDate"') DO SET %%i=%%j
FOR /F "TOKENS=1-4* DELIMS=%sDate% " %%A IN ('DATE/T') DO (
        IF %iDate%==0 (
                SET Year=%%C
                SET Month=%%A
                SET Day=%%B
        )
        IF %iDate%==1 (
                SET Year=%%C
                SET Month=%%B
                SET Day=%%A
        )
        IF %iDate%==2 (
                SET Year=%%A
                SET Month=%%B
                SET Day=%%C
        )
)
GOTO :EOF
Rem Отображение итоговой даты
:ShowDate
SET Month=0%Month%
SET Month=%Month:~-2%
SET Day=0%Day%
SET Day=%Day:~-2%
IF %iDate%==0 ECHO %Month%%sDate%%Day%%sDate%%Year%
IF %iDate%==1 ECHO %Day%%sDate%%Month%%sDate%%Year%
IF %iDate%==2 ECHO %Year%%sDate%%Month%%sDate%%Day%
GOTO :EOF


ShaddyR 20-10-2006 10:10 500419

amel27: силён!

Sanja Alone 11-07-2007 11:50 611497

Немного дополнил ф-цию получения текущей даты из поста 18. Дополнение связано с различием в отображении даты в зависимости от sLongDate и sShortDate. Я обошелся без необходимости проверки этих параметров в реестре, а поступил проще (правда, понадобилась лишняя переменная).
Код:

Rem Чтение текущей даты в переменные окружения
:GetDate
for /f "tokens=1,3" %%j in ('reg query "HKCU\Control Panel\International" /s^|findstr /C:"iDate" /C:"sDate"') do set %%j=%%k
for /f %%j in ('echo %date%^|find " " /C') do (
        if %%j == 1 (
                for /f "tokens=2 delims= " %%j in ('echo %date%') do set mdate=%%j
        ) else (
                set mdate=%date%
        )
)
for /f "tokens=1,2,3 delims=%sDate%" %%j in ('echo %mdate%') do (
        if %iDate%==0 (
                set Month=%%j
                set Day=%%k
                set Year=%%l
        )
        if %iDate%==1 (
                set Day=%%j
                set Month=%%k
                set Year=%%l
        )
        if %iDate%==2 (
                set Year=%%j
                set Month=%%k
                set Day=%%l
        )
)
goto :EOF

Да, совсем забыл. Вот ф-ция для установки даты:
Код:

Rem Установка даты
:SetDate
if %iDate%==0 (
        date %Month%%sDate%%Day%%sDate%%Year%
) else (
        if %iDate%==1 (
                date %Day%%sDate%%Month%%sDate%%Year%
        ) else (
                if %iDate%==2 (
                        date %Year%%sDate%%Month%%sDate%%Day%
                )
        )
)
goto :EOF

Ситуация, в к-рой могут пригодиться приведенные выше ф-ции:
Код:

Rem Определение текущей даты
call :GetDate
Rem прибавление 1 года к дате
set /a Year+=1
Rem Установка даты
call :SetDate

Rem Выполнение определенных манипуляций

Rem Возврат реальной даты (отнимаем 1 год)
set /a Year-=1
Rem Установка даты
call :SetDate


shad_ow 25-08-2009 08:59 1202479

Вложений: 1
Доброе время суток!
Прошу помощи с данным скриптом. До этого месяца скрипт работал отлично и без нареканий но в этом месяце он стал неправильно определять дату (определяет как 0-1-11 ). При этом говорит что "Неправильное число. Числовые константы должны быть десятичными (17) шестнадцатеричными (0x11),или восьмеричными (021)."

Выяснил что всё дело в секции:
Цитата:

Rem Расчет года и месяца, отстоящих от заданного
:NextMonth
SET /A MNDF=%Year%*12+%Month%%1
SET /A Year=(%MNDF%-1)/12
SET /A Month=%MNDF%-%Year%*12
GOTO :EOF
Вывод скрипта в прикреплённом файле
Но что конкретно не так понять не могу. Прошу помощи.
Заранее благодарен!

valikos 25-01-2010 23:56 1329884

Доброе время суток!
Написал батник для проверки даты, вроде заработал, но потом выяснилось, что батник работает только в пределах одного месяца!!! Подскажите, что не так?

Echo=off
if /i '%date%' GTR '27.01.2010' move /Y C:\Temp\Append.exe C:\Rk\EXE
C:\Temp\Append.exe

По 27.01.2010 все работает - запускается Append.exe, с 27.01.2010 по 31.01.2010 тоже работает -выполняется move /Y C:\Temp\Append.exe C:\Rk\EXE, соответственно Append.exe не запускается.

Если на ПК установить дату к примеру 27.01.2010, а в батнике установить 06.02.2010
if /i '%date%' GTR '06.02.2010' move /Y C:\Temp\Append.exe C:\Rk\EXE
C:\Temp\Append.exe , то почему-то происходит перемещение файла!!! хотя 06.02.2010 еще не наступило!!!

gora 26-01-2010 15:43 1330394

valikos, так даты не сравнивают, попробуйте записать условие так:
Код:

If %date:~6,4%%date:~3,2%%date:~0,2% GTR 20100127 ...
Где 20100127 - это ваша дата написанная "наоборот", начиная с года.

valikos 26-01-2010 23:48 1330850

Спасибо, все работает, еще вопрос - как скрыть сообщение о перемещении файла- "перемещено файлов 1" ? @Echo off не помогает.

gora 27-01-2010 00:18 1330875

Цитата:

Цитата valikos
как скрыть сообщение о перемещении файла »

перенаправьте вывод в Nul
Код:

... move /Y C:\Temp\Append.exe C:\Rk\EXE>Nul

valikos 27-01-2010 10:04 1331133

Спасибо, все получилось! :up

valikos 27-01-2010 22:28 1331761

Аможно вообще убрать черное окно при старте батника?

gora 28-01-2010 08:15 1331996

Цитата:

Цитата valikos
убрать черное окно при старте батника? »

Скрытие консольных окон


Время: 11:35.

Время: 11:35.
© OSzone.net 2001-