Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 2

Модерирует : KLASS, IFkO

vu1tur (27-04-2007 11:55): продолжаем в теме «Задачи на bat-файлах 3»  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

   

vu1tur



Moderator-Saaber
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Задачи на bat-файлах (часть 1)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки
 
Полезные утилиты
 
Готовые решения и частые вопросы:
  • Встроенный справочник по командам
  • Создание помощи по всем командам консоли 2000 и XP
  • Альтернативные решения »
  • Работа с текстом, датой, и файлами »
  • Администрирование, автоматизация и сеть »
  • Работа с переменными и параметрами ком. строки »
     
    Описания работы команд и символов участниками темы:
    · setlocal enabledelayedexpansion и переменные окружения
    · символы & и && в командной строке
    · Переменная %0
     
    Невозможности — что нельзя сделать с помощью командных файлов:
    · изменть конфигурацию IP на удаленной машине (без помощи rcmd.exe) [добавил ALEF]
     
    Старая версия первого сообщения

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 16:59 14-11-2006 | Исправлено: Elroir, 04:30 26-04-2007
    the13th

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bol970
    Попробуй так:
    if (TodayMonth == 0)

    Всего записей: 19 | Зарегистр. 15-03-2005 | Отправлено: 13:05 11-01-2007
    StanislavG



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Мне надо что-бы имя архива было дата создания файлов

    Всего записей: 34 | Зарегистр. 10-01-2007 | Отправлено: 13:54 11-01-2007
    bobaZz



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    У меня следующая задача:
    На работе на серваке стоит Маршрутизация и удаленный доступ (RRAS) с помомощью которого я из дома подключаюсь к сети на работе. Проблема в том что модем иногда подвисает и к RRAS уже невозможно подключится (модем не снемает трубку), необходимо чтобы с помощью батника проверялся модем - завис или не завис и в случае зависания перезагружать комп. Помогите реализовать.

    Всего записей: 6 | Зарегистр. 06-12-2005 | Отправлено: 14:21 11-01-2007 | Исправлено: bobaZz, 14:23 11-01-2007
    Bol970



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    the13th
    Пробовал

    Цитата:
    if (TodayMonth == 0)

    результат - "NaN"

    Всего записей: 94 | Зарегистр. 05-10-2004 | Отправлено: 14:32 11-01-2007
    Smitis



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Bol970

    Цитата:
    if (TodayMonth = 0)

    Во-первых, ты делаешь ПРИСВАИВАНИЕ переменной нулевого значения. Так, что, с этой точки зрения работает правильно (всегда ложь). Как уже советовали, используй операцию "==".
    А во-вторых, используй метод toString для преобразования чисел в строки.

    ----------
    Разум когда-нибудь победит

    Всего записей: 2469 | Зарегистр. 09-02-2003 | Отправлено: 15:05 11-01-2007
    StanislavG



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я тут откредактировал батниккоторый лежел на этом форуме но он чего то у меня не работает посмотрите  вчем дело:
     
    @echo off
    setlocal
    set dt=%date%
    FOR %%I IN (*.*) DO call :finddate "%%I" %dt:~0,2% %dt:~3,2% %dt:~6,4%
    goto :EOF
     
    :finddate
    for /F "usebackq tokens=1,2,3,4 delims=. " %%A IN (`"dir /T:C %1 | find %1"`) DO call :test %%A %%B %%C %1 %2 %3 %4
    goto :EOF
     
    :test
    rem File's date
    set fd=%5
    set fm=%6
    set fy=%7
    rem Current date
    set curd=%5
    set curm=%6
    set cury=%7
    set /a prevd=%curd%-1
    set prevm=%curm%
    set prevy=%cury%
    set prevye=%cury%
    if %curm%==12 (set prevme=11& set days=30)
    if %curm%==11 (set prevme=10& set days=31)
    if %curm%==10 ( set prevme=09& set days=30)
    if %curm%==09 ( set prevme=08& set days=31)
    if %curm%==08 ( set prevme=07& set days=31)
    if %curm%==07 ( set prevme=06& set days=30)
    if %curm%==06 ( set prevme=05& set days=31)
    if %curm%==05 ( set prevme=04& set days=30)
    if %curm%==04 ( set prevme=03& set days=31)
    if %curm%==03 ( set prevme=02& set days=28)
    if %curm%==02 ( set prevme=01& set days=31)
    if %curm%==01 ( set prevme=12& set days=31& set /a prevye=%prevy%-1)
    if %prevd% LEQ 0 (
    set /a prevd=%days%+%prevd%
    set prevm=%prevme%
    set prevy=%prevye%
    )
    set match=true
    if not "%fd%"=="%prevd%" ( set match=false)
    if not "%fm%"=="%prevm%" ( set match=false)
    if not "%fy%"=="%prevy%" ( set match=false)
    if "%match%"=="true" (copy %4 c:\test)

    Всего записей: 34 | Зарегистр. 10-01-2007 | Отправлено: 15:06 11-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StanislavG

    Цитата:
    Я тут откредактировал батниккоторый лежел на этом форуме но он чего то у меня не работает посмотрите  вчем дело

    Насколько я помню, этот батник находит все файлы, которым ровно 4 недели и заточен под определенный формат даты.
    В принципе, кусок кода, который находит дату создания файла находится после метки :finddate и до :test. Но тут тоже важен формат даты, которую выводит команда dir /t:c. Что у тебя показывает эта команда?

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 17:04 11-01-2007
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Обращусь за помощью еще раз
     
    Загружена переменная %mail_adress% Значение ее, допустим  tureth[]yahoo.mm
     
    есть файл send.ini
     

    Цитата:
    1=Ruslan
    2=Semen
    3=Andrey
    4=Viktor
    5=Maxim
    6=Slava

     
    есть файл shablon.txt
     

    Цитата:
    Здравствуй, %%b
    Пиши мне на %mail_adress%

     
    Задача - создать 6 текстовых файлов letter_y.txt с текстом:
     
    letter_1.txt
     

    Цитата:
    Здравствуй, Ruslan
    Пиши мне на tureth[]yahoo.mm

     
    letter_2.txt
     

    Цитата:
    Здравствуй, Semen
    Пиши мне на tureth[]yahoo.mm

     
    и т.д.
     
    Выполняю:
     

    Цитата:
    for /f "tokens=1-2 delims==" %%a in (send.ini) do more shablon.txt > letter_%%a.txt

     
    Получается 6 файлов letter_y.txt с одним и тем же текстом, полностью повторяющим текст шаблона. Замена команды more на type не помогает.
    Подскажите, пожалуйста, как добиться нужного результата.

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 17:12 11-01-2007
    StanislavG



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
     
    Вот если можно так сказать лог батника
     

    Цитата:
    N:\TEST>rem @echo off  
     
    N:\TEST>setlocal
     
    N:\TEST>set dt=11.01.2007  
     
    N:\TEST>FOR %I IN (*.arj) DO call :finddate "%I" 11 01 2007  
     
    N:\TEST>call :finddate "jour070110.ARJ" 11 01 2007  
     
    N:\TEST>for /F "usebackq tokens=1,2,3,4 delims=. " %A IN (`"dir /T:C "jour070110.ARJ" | find "jour070110.ARJ""`) DO call :test %A %B %C "jour070110.ARJ" 11 01 2007  
     
    N:\TEST>call :test 10 01 2007 "jour070110.ARJ" 11 01 2007  
     
    N:\TEST>rem File's date  
     
    N:\TEST>set fd=11  
     
    N:\TEST>set fm=01  
     
    N:\TEST>set fy=2007  
     
    N:\TEST>rem Current date  
     
    N:\TEST>set curd=11  
     
    N:\TEST>set curm=01  
     
    N:\TEST>set cury=2007  
     
    N:\TEST>set /a prevd=11-1  
     
    N:\TEST>set prevm=01  
     
    N:\TEST>set prevy=2007  
     
    N:\TEST>set prevye=2007  
     
    N:\TEST>if 01 == 12 (set prevme=11  & set days=30 )  
     
    N:\TEST>if 01 == 11 (set prevme=10  & set days=31 )  
     
    N:\TEST>if 01 == 10 (set prevme=09  & set days=30 )  
     
    N:\TEST>if 01 == 09 (set prevme=08  & set days=31 )  
     
    N:\TEST>if 01 == 08 (set prevme=07  & set days=31 )  
     
    N:\TEST>if 01 == 07 (set prevme=06  & set days=30 )  
     
    N:\TEST>if 01 == 06 (set prevme=05  & set days=31 )  
     
    N:\TEST>if 01 == 05 (set prevme=04  & set days=30 )  
     
    N:\TEST>if 01 == 04 (set prevme=03  & set days=31 )  
     
    N:\TEST>if 01 == 03 (set prevme=02  & set days=28 )  
     
    N:\TEST>if 01 == 02 (set prevme=01  & set days=31 )  
     
    N:\TEST>if 01 == 01 (set prevme=12  & set days=31  & set /a prevye=2007-1 )  
     
    N:\TEST>if 10 LEQ 0 (
    set /a prevd=31+10  
     set prevm=12  
     set prevy=2006  
    )  
     
    N:\TEST>set match=true  
     
    N:\TEST>if not "11" == "10" (set match=false )  
     
    N:\TEST>if not "01" == "01" (set match=false )  
     
    N:\TEST>if not "2007" == "2007" (set match=false )  
     
    N:\TEST>if "false" == "true" (copy "jour070110.ARJ" c:\test )  
     
    N:\TEST>goto :EOF  
     
    N:\TEST>goto :EOF  
     

     
     
    Добавлено:
    Elroir
     
     И еще чуть не забыл батник находит файлы за прошедший день

    Всего записей: 34 | Зарегистр. 10-01-2007 | Отправлено: 17:12 11-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StanislavG
    Я совсем запутался. Еще раз, подробно объясни, что тебе надо сделать. Заархивировать каждый файл и назвать архив по дате создания этого файла?
     
    Tipulatoid
    Код батника:

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    set mail_adress=tureth[]yahoo.mm
    for /f "delims== tokens=1,2" %%a in (send.ini) do call :create %%a %%b
    goto :EOF
     
    :create
    set rname=%2
    for /f "tokens=*" %%I in (shablon.txt) do echo %%I>>letter_%1.txt
     

    shablon.txt:

    Код:
     
    Здравствуй, !rname!  
    Пиши мне на !mail_adress!
     

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 18:31 11-01-2007 | Исправлено: Elroir, 18:33 11-01-2007
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StanislavG

    Цитата:
     чуть не забыл батник находит файлы за прошедший день

    А ты попробуй не залезать в дебри батникописания, а почитать справку к ARJ В идеале, если запускать по планировщику в 23:59 - можно вообще одной строчкой обойтись. Ну на крайняк один день то уж от сегодняшней даты легко отнять.
     
    Это кусочек того, что выдает русский http://arj.sourceforge.net/

    Цитата:
     
      n: только новые (несуществующие) файлы
      o: файлы, изм. по/после ГГГГММДДЧЧММСС
         o:        сегодня
         o19901225: по/после 25/12/1990
     ob: файлы, изм. до ГГГГММДДЧЧММСС
         ob:       раньше, чем сегодня
         ob19901225: раньше 25/12/1990
     od: изм. не ранее, чем N дней назад
         od5: пять или меньше дней назад
     oa: файлы, использ. после ГГГГММДДЧЧММСС
         oa:       сегодня
         oa19901225: после 25/12/1990
    oab: файлы, использ. до ГГГГММДДЧЧММСС
         oab:      раньше, чем сегодня
         oab19901225: раньше 25/12/1990
     oc: файлы, созд. после ГГГГММДДЧЧММСС
         oc:       сегодня
         oc19901225: после 25/12/1990
    ocb: файлы, созд. ГГГГММДДЧЧММСС
         ocb:      раньше, чем сегодня
         ocb19901225: раньше 25/12/1990
     
     
    <Вторичные ключи>
     h#: текущая дата -> название архива  
    h#1: текущее время -> название архива  
    h#2: дата/время (ДЧЧММСС) -> назв.    
         (формат: h#{Y,M,D,N,h,m,s})      
         h#YYYY-MMDD: дополнить ГГГГ-ММДД
     

    Всего записей: 1669 | Зарегистр. 08-12-2004 | Отправлено: 18:33 11-01-2007
    StanislavG



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
     
    Давай так у меня есть 25 файлов с датой создания 10.01.2007 мне надо их за архивировать так что-бы имя архива было jour1001.arj при этом вся операция(сбор и архивирование) будет проходить 11.01.2007. Передомной стоит задача сделать батник так что-бы он 11.01.2007 собирал файлы с датой создания 10.01.2007 и заархивировал как я выше написал. первую часть батника я выложил по сбору файлов. Помогите чем сможите
     
    Добавлено:
    igor_andreev
     
    Эти файлы типа логов если я их собиру 10 числа то потеряю часть информации

    Всего записей: 34 | Зарегистр. 10-01-2007 | Отправлено: 18:50 11-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StanislavG
    Вот теперь понятно.
    Поменяй set fd=%5,set fm=%6,set fy=%7 обратно на set fd=%1,set fm=%2,set fy=%3.
    После этого в директории test у тебя будут файлы созданные вчера. Дальше запускай команду архивации и подставляй в название создаваемого архива %prevd%%prevm%.
    А чем не нравится то, что предложил igor_andreev? Используй условие "файлы созданные после позавчера" и "файлы созданные раньше, чем сегодня".  

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 19:17 11-01-2007
    StanislavG



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
     
    Да вот пробую Большое спасибо
     
    Добавлено:
    Elroir
     
    А еще есть пару вопрос  
     

    Цитата:
    1.Можно ли как то поставить таймер что-бы например в 1 час ночи запустился батник;

     

    Цитата:
    2.И как сделать что-бы по окончанию цикла батника запустился архиватор

     

    Всего записей: 34 | Зарегистр. 10-01-2007 | Отправлено: 19:28 11-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StanislavG

    Цитата:
    Можно ли как то поставить таймер что-бы например в 1 час ночи запустился батник

    Можно:

    Код:
    at 01:00 /every:M,T,W,Th,F,S,Su c:\utilities\archive.cmd

    Справка по команде at - здесь.

    Цитата:
    как сделать что-бы по окончанию цикла батника запустился архиватор  

    После первого for-a в батнике, перед командой goto :EOF, вставь строчку запуска архиватора.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 20:02 11-01-2007
    StanislavG



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
     
    А если батник в Винде не запускаеться что может быть

    Всего записей: 34 | Зарегистр. 10-01-2007 | Отправлено: 21:24 11-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StanislavG
    Что значит не запускается? Как это выглядит? "В Винде" - ты имеешь в виду из эксплорера, а не из командной строки?

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 21:31 11-01-2007
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Спасибо большое. Жаль, тут плюсы не выставляются.

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 01:17 12-01-2007
    evgeni666



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    StanislavG
    Твоя задача решается намного проще.
     
    arc.bat

    Цитата:
     
    IF "%1" NEQ "" GOTO %1
     
    :: директория, с файлами, которые надо паковать
    set source_dir=c:\temp
    :: директория, куда кладем архивы
    set dest_dir=c:\arc
    :: путь до архиватора
    set arc=c:\util\rar.exe
     
    :: Включаем отложенное расширение переменныхи выполняем основной цикл
    cmd /v:on /c %0 START
    GOTO :EOF
     
    :START
    :: создаем списки файлов
    for %%I in (%source_dir%\*.*) do (
        set filedate=%%~tI
        set filedate=!filedate:~0,2!!filedate:~3,2!
        echo %%I >>%temp%\arc_!filedate!.txt
    )
     
    :: архивируем  
    for %%I in (%temp%\arc_*.txt) do (
        set arcname=%%~nI
        set arcname=%dest_dir%\!arcname:~4!.rar
        %arc% a !arcname! @%%I
        del /Q/F %%I
    )
     

     
    Далее должно быть понятно.
     
    PS. Отложенное выполнение переменных можно прописать в реестре. Тогда не нужны будут выкрутасы с запуском батника из под самого себя.
     
    PPS. Твой батник может тебе подложить хорошую свинью в високосный год.

    Всего записей: 367 | Зарегистр. 22-12-2005 | Отправлено: 02:27 12-01-2007 | Исправлено: evgeni666, 02:34 12-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    evgeni666

    Цитата:
    Включаем отложенное расширение переменныхи выполняем основной цикл  
    cmd /v:on /c %0 START

    А что, команду setlocal enabledelayedexpansion, уже отменили?

    Цитата:
    set filedate=%%~tI  

    Модификатор ~t, выдает дату/время модификации файла, а StanislavG просил дату создания.
     
    Дальше - человеку надо архивировать вчерашние файлы. У тебя архивируются все файлы сгруппированные по дате.
    После первого запуска, в temp директории уже будут txt файлы, которыми пользуется батник, то есть при каждом последующем запуске, туда будут добавляться записи.
    Короче, батник красивый, полезный, но не до конца отлаженный и делает не то,что нужно.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 04:24 12-01-2007 | Исправлено: Elroir, 04:41 12-01-2007
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 2
    vu1tur (27-04-2007 11:55): продолжаем в теме «Задачи на bat-файлах 3»


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru