Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

Ответить
Настройки темы
CMD/BAT - [решено] Как создать бат, чтобы проверял число месяца?

Аватара для Ingolder

Старожил


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

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


Задача такая.

Есть файл в директории 1.
Его нужно один раз в месяц копировать из директории 1 в директорию 2.
Эта операция должна происходить в промежутке с 20 по 30 число месяца (и не больше одного раза за период, т.е. если мы двадцать третьего числа запустили бат, он сработал, то чтобы в этом месяце он больше уже не срабатывал).


Не доходит, помогите пжлст

Отправлено: 18:10, 02-12-2009

 

Новый участник


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

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


Код: Выделить весь код
@echo off
rem Пример единоразового копирования файла filename.txt
title=Copier of files
SetLocal EnableExtensions EnableDelayedExpansion
SET DD=%DATE:~0,2%
echo %DD% | findstr "20 21 22 23 24 25 26 27 28 29 30" >nul
if !errorlevel!==0 (
if exist C:\DIR1\filename.txt (
if not exist C:\DIR2\filename.txt (
copy C:\DIR1\filename.txt C:\DIR2\filename.txt
)
)
)

Отправлено: 22:22, 02-12-2009 | #2



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

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


Старожил


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

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


AHTuKuJIJIeP, сделано неплохо, вот только копия файла уже существует и скрипт не отработает а если убрать проверку существования копии (которая сама не исчезнет), то при повторном запуске твой скрипт заново будет копировать файл.

предлагаю вести лог и по нему и отслеживать была ли сделана копия:
Код: Выделить весь код
@Echo off
SetLocal EnableExtensions

Set File=C:\1\MyFile.dat
Set BackUp=C:\2\

set Msg=Nothing to do
set tm=%time::=-%
set tm=%date:~6,4%-%date:~3,2%-%date:~0,2%_%tm:~0,-3%

set Chk=%tm:~8,2%
if /I %Chk% LSS 20 Goto End

set Chk=%tm:~0,7%
for /f "Tokens=1,2* Delims=:" %%D in ('FindStr /i /c:"Synchronization Done" %~dpn0.log') do set Last=%%D
set Last=%Last:~0,7%
if "%Chk%"=="%Last%" Goto End

copy /y %File% %BackUp%
if %ErrorLevel%==0 (set Msg=Synchronization Done
) else set Msg=Synchronization Failed !!!

:End
echo %tm%: %Msg%>>%~dpn0.log
* 2 замечания (фичи ):
1. если копия файла окажется защищена или занята, то копирования не произойдет - смотрите лог
2. малость упростил проверку - копирование возможно не с 20 по 30, а просто с 20 (т.е. и 31го тоже)
Если второе замечание критично - легко поправлю проверку.

-------
Как сказало Дерево Дровосеку: "я - пень".

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

Отправлено: 11:53, 03-12-2009 | #3


Googler


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

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


Код: Выделить весь код
Set SRC=C:\TEST1\file.txt
Set DST=C:\TEST2\

:: Проверка на день месяца

If "%DATE:~0,1%"=="0" (Set $D=%DATE:~1,1%) Else Set $D=%DATE:~0,2%
If %$D% LSS 20 Exit /B 1

:: Проверка на последний запуск (ini-файл)

For /F "UseBackQ" %%i In ("%~dpn0.ini") Do Set $L=%%i
If "%$L%"=="%DATE:~3,2%" Exit /B 2

:: Копирование / сохранение параметров запуска

XCOPY "%SRC%" "%DST%" /Y/R
If Not ErrorLevel 1 Echo %DATE:~3,2%>"%~dpn0.ini"

Последний раз редактировалось amel27, 07-12-2009 в 08:23. Причина: очепятка

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

Отправлено: 11:54, 03-12-2009 | #4


Аватара для Ingolder

Старожил


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

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


NiOl, здОрово, спасибо, ваше работает. Вы не могли бы как-то всё прокомментировать для тех, кто не очень? А т оя не очень..


amel27, а в вашем случае он полюбому копирует с заменой..

Отправлено: 18:46, 06-12-2009 | #5


Googler


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

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


Цитата Ingolder:
полюбому копирует с заменой »
исправил опечатку (в последней строке), добавил комментарий

Отправлено: 08:22, 07-12-2009 | #6


Аватара для Ingolder

Старожил


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

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


amel27, вроде работает.
Единственное, что - очень вас прошу, для тех кто совсем в танке, прокомментируйте поподробнее, не "в общем", а "как и чего".

очень прошу

Отправлено: 17:10, 07-12-2009 | #7


Старожил


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

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


Цитата Ingolder:
Вы не могли бы как-то всё прокомментировать для тех, кто не очень? А т оя не очень.. »
Чтож, попробую, понимаю как сложно без понятного примера разбираться в чем-то новом:

Откючаем эхо команд (чтоб сам скрип на экране не выводился) и разрешаем "новшества" в командах от Большого Билла
Код: Выделить весь код
@Echo off
SetLocal EnableExtensions
Самое простое - указываем какой файл копируется и куда он копируется.
Код: Выделить весь код
Set File=C:\1\MyFile.dat
Set BackUp=C:\2\
Сообщение для лог-файла "по-умолчанию"
Код: Выделить весь код
set Msg=Nothing to do
Стандартная "макрокоманда" для получения тек. даты и времени в формате YYYY-MM-DD_HH-MM-SS (если в винде указать, что мы находимся в штатах, то работать не будет - там дата имеет вид MM/DD/YYYY). Первая строчка из переменной %time% (формат примерно такой: 20:30:19,54) заменяет все ":" на "-" и кладет в переменную %tm%.
Вторая строчка использует переменную %date% вида 07.12.2009 и из нее строит готовый текст, состоящий из: 4х символов с 6й позиции (год) + символ "-" + 2 символа с 3й позиции (месяц) + "-" + 2 символа с 0й позиции (число) + "_" + уже полученное время (вида 20-30-19,54, где ":" заменено на "-") без 3х последних символов. (уфф) * см. set /?
Код: Выделить весь код
set tm=%time::=-%
set tm=%date:~6,4%-%date:~3,2%-%date:~0,2%_%tm:~0,-3%
Таким же образом берем из нашей даты %tm% 2 символа с текущим числом и проверяем, что сегодняшнее число меньше 20 ("LSS"="LeSS then", см. if /?). Если да - на выход, где выводится уже готовое сообщение в лог-файл.
Код: Выделить весь код
set Chk=%tm:~8,2%
if /I %Chk% LSS 20 Goto End
Получаем от текущей даты первые 7 символов - год и месяц - будем их искать в лог-файле в строках с успешной синхронизацией.
Код: Выделить весь код
set Chk=%tm:~0,7%
Выполняем внешнюю команду FindStr, которая ищет строку в файле(ах). Ключ /I говорит игнорировать регистр, а ключ /c:"" ищет указанную строку "строго", т.е. с указанными пробелами, не разрывая слова. И ищется все это в файле, полученном из имени батника (%0 - сам батник): модификатор d говорит взять имя диска, где лежит батник, p - путь, а n - имя батника без расширения, ну а разширение добавляем .log. Таким образом если %0 дает что-нить типа "FileSinc.bat", то %~dpn0.log выдаст с полным путем "D:\BackUp\FileSinc.log". (см. "call /?" и "for /?").
Но результат поиска будет выведен на экран, а нам надо затолкать его в переменные и анализировать. Поэтому команда вызывается внутри цикла, рабирающего строку или читающего текстовые файлы или перехватывающего вывод на экран (как в данном случае). В цикле сказано, что данные разделены на "столбцы" символом ":" (delims) и что нас интересует первый столбец в первой переменной (%%D), а второй и все остальные ("2*") столбцы - во вторую переменную (по алфавиту это будет %%E). (*задним числом можно сказать, что нам плевать на остальные столбцы - думал те данные понадобятся) Цикл пройдет по всем строкам, где FindStr нашел отметку об успешном копировании и первый столбец (с датой) по очереди положит в переменную %Last%. В итоге получим дату самого-присамого последнего копирования:
Код: Выделить весь код
for /f "Tokens=1,2* Delims=:" %%D in ('FindStr /i /c:"Synchronization Done" %~dpn0.log') do set Last=%%D
Оставляем от даты последнего копирования только первые 7 символов - год и месяц.
Если год и месяц текущей даты и даты последнего копирования совпадают, значит копирование в этом месяце уже было и ничего не нужно делать - переходим в конец с уже заготовленным сообщением "Nothing to do".
Код: Выделить весь код
set Last=%Last:~0,7%
if "%Chk%"=="%Last%" Goto End
Копируем файл без запроса на перезапись уже имеющегося файла (ключ /Y).
Если Код Выхода команды (Код Ошибки) Copy равен нулю - значит все прошло успешно (готовим соответствующее сообщение), в противном случае готовим другое сообщение, куда по-хорошему можно было добавить сам код ошибки (например 2="файл не найден" и т.д. - коды ошибок можно посмотреть в иНете. Особенность: переменную с Кодом Ошибки можно прочитать только раз - в следующий раз там будет результат, которым закончилось само чтение Кода Ошибки!)
Код: Выделить весь код
copy /y %File% %BackUp%
if %ErrorLevel%==0 (set Msg=Synchronization Done
) else set Msg=Synchronization Failed !!!
Собственно все - вывод текущей даты с двоеточием на конце и текстом уже подготовленного сообщения в лог-файл *метки для перехода в батч-файлах начинаются с двоеточия. Некоторые "товарисчи" используют этот символ в качестве ремарки вместо команды rem. Это мовитон, использует лишние ресурсы (все метки интерпретатор должен помнить) и может привести к ошибке "на невнимательность".
Код: Выделить весь код
:End
echo %tm%: %Msg%>>%~dpn0.log

Отправлено: 21:28, 07-12-2009 | #8



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Как сделать,что б батник проверял число ? mitiya Автоматическая установка Windows 2000/XP/2003 27 28-01-2010 08:15
E-mail - Как настроить бат через сеть LaoTsi Сетевые технологии 2 07-02-2009 20:48
[решено] Как уменьшить скорость вращения (число оборотов) вентилятора на процессоре dsl Разгон, охлаждение и моддинг 6 18-01-2009 15:39
Интерфейс - [решено] Дни недели и месяца на украинском!Как убрать? Voodoo Child Microsoft Windows Vista 3 07-04-2008 11:06
как создать пакет, чтобы не собирать из портов krestik Общий по FreeBSD 11 13-09-2006 13:25




 
Переход