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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Petrofox

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Там разные расширения, и мне надо все разархивировать в одну папку конкрентную, сделать так?:
     
    @echo off  
    for %%I in (*.*) do (  
    :: Следующую строчку нужно подстроить к своей утилите разархивации  
    unzip %%I -d /C:/имя_папки  
    )  
     
     
    Добавлено:
    @echo off
    for %%I in (*.*) do (
    :: Следующую строчку я подстроил к своей утилите разархивации
    pczipc -extr -dir=current %%I
    )
     
    Вот так сделал, но не работает (

    Всего записей: 16 | Зарегистр. 12-01-2007 | Отправлено: 09:03 14-01-2007
    Elroir



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

    Код:
    pkzipc.exe -extract %%I current

    Директория current должна существовать.
    Я предпологаю, что pczipc - это опечатка, потому что я такой утилиты в инете не нашел.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 10:59 14-01-2007
    Petrofox

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    http://www.macloud.ru/files.html  
    Архиватор ZIP 4.00, консольный, W32    260kb
    Вот он,  только да ошибка, первый раз правильно написал pkzipc.exe
     
    Вот пример использования Extract:
    pkzipc -extr=up save.zip
     
    Делаю:
    pkzipc -extr=current ar1.zip
     
    папка current и архив ar1.zip находятся в папке с pkzipc.exe
    но никакго результата (

    Всего записей: 16 | Зарегистр. 12-01-2007 | Отправлено: 12:26 14-01-2007
    Jon_Dow

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Делаете неправильно. Опции:  
    -extr=all
    -extr=freshen
    -extr=update
    используются для управления извлечением, а не для указания папки... (Т.е. извлечение всех файлов, только замена существующих в конечной директории файлов с более старой датой, извлеченние более новых и несуществующих в конечной директории)
    А вам надо все-таки:
    pkzipc -extract ar1.zip current
    ЗЫ - результат кстати был: Unknown or illegal sub-option - extr=current
    Обращайте внимание на сообщения...
     
    Добавлено: к тому же вы НИ ЕДИНОГО РАЗУ не прочитали внимательно сообщения уважаемого Elroir - что нехорошо - он ведь именно для вас решал вашу проблему...

    ----------
    Я такую личшную нэприязнь испитываю к яндексгуглкасперский, что кушать не могу.:abuse: @Billon

    Всего записей: 732 | Зарегистр. 25-11-2006 | Отправлено: 13:58 14-01-2007 | Исправлено: Jon_Dow, 14:32 14-01-2007
    Tipulatoid



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

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

     
    Уважаемый Elroir, этот код что вы мне написали, я адаптировал под свою задачу, и он прекрасно работает. Однако осталась большая проблема - код этот у меня стоит где-то в середине батника и команда call, обработав команды метки :create и сделав что от нее требовалось - файлы писем, не останавливается, а идет дальше, обрабатывая команды следующих меток, прогоняя их до конца батника 6 раз (у меня в файле send.ini 6 строк). Этого совсем не нужно. Как указать команде call чтоб обрабатывала команды метки :create и все? Эксперементы с goto :EOF не помогли. Команду endcall в справке Windows не нашел. exit /b просто заканчивает работу батника.
    Конечно, данный участок кода можно вынести в отдельный батник - но, имхо, это плохой стиль программирования - плодить батники. Все должен делать один файл. Спасибо.
     
    На всякий случай повторю send.ini
     

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

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 19:09 14-01-2007 | Исправлено: Tipulatoid, 19:12 14-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tipulatoid
    Если я правильно понимaю - проблема должна решиться добавлением одной строчки:

    Код:
     
    :create  
    set rname=%2
    for /f "tokens=*" %%I in (shablon.txt) do echo %%I>>letter_%1.txt
    goto :EOF
     

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Экспериментировал я с goto :EOF Не получалось.  Куда только не вставлял Или я такой талантливый?
    Сообразил сейчас такое решение - данный участок кода с помощью echo выношу в вспомогательный bat-файл, потом запускаю его через call из основного батника, вспомогательный делает письма, затем основной его удаляет.

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 20:15 14-01-2007 | Исправлено: Tipulatoid, 21:00 14-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tipulatoid
    Попробуйте поместить блок :create в самый конец батника. Или приведите полный код этого батника - можно в ПМ.

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
     
     Я сделал запуск планировщиком и хочу вести лог я написал так в ланировщике
    Цитата:
    c:\jour.bat >log_bat\%date~-10%.txt
     
     
     
    Добавлено:
    Elroir
    Я писал
    Цитата:
     как сделать что-бы по окончанию цикла батника запустился архиватор  

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

    У меня все заархивировалось но не с датой создания файлов. посмотри правильно ли я сделал
    Цитата:
    @echo off
    rem start %time%
    setlocal
    set dt=%date%
    FOR %%I IN (*.lo1) DO call :finddate "%%I" %dt:~0,2% %dt:~3,2% %dt:~6,4%
     
    c:
    cd \test1
    arj32 m jour%4.dh0 *.*
     
    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=%1
    set fm=%2
    set fy=%3
    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 c:\test\%4 c:\test1\*.*)
     

     

    Всего записей: 34 | Зарегистр. 10-01-2007 | Отправлено: 09:51 15-01-2007 | Исправлено: StanislavG, 14:45 15-01-2007
    Elroir



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

    Цитата:
    У меня все заархивировалось но не с датой создания файлов

    Используй следующую конструкцию:

    Код:
    arj32 m jour%prevd%%prevm%.dh0 *.*

     
    В последней строчке, напиши так:

    Код:
    if "%match%"=="true" (copy c:\test\%4 c:\test1)

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    В жэтой строчке указываеться тип файла  
     
    Цитата:
    FOR %%I IN (*.lo1) DO call :finddate "%%I" %dt:~0,2% %dt:~3,2% %dt:~6,4%  

     
    А где можно указать каталог из которого он обрабатывает файлы
     
    И еще он чего то повторяет свои действие в чем может быть причина
     

    Всего записей: 34 | Зарегистр. 10-01-2007 | Отправлено: 16:43 15-01-2007 | Исправлено: StanislavG, 17:34 15-01-2007
    Zyava



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

    Цитата:
    Попробуй так:  
    START /B /WAIT

     
    Так оно будет запускаться в том же окне и соответственно при вылете/удаление из процессов закрываться вместе с батником - уже пробовал и сейчас специально еще раз убедился .

    Всего записей: 324 | Зарегистр. 04-05-2006 | Отправлено: 17:28 15-01-2007
    StanislavG



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

    Цитата:
    @echo off
    start %time%
    setlocal
    set dt=%date%
    FOR %%I IN (*.lo1) DO call :finddate "%%I" %dt:~0,2% %dt:~3,2% %dt:~6,4%
     
    cd w:\nbumail\journal
    arj32 m w:\nbumail\journal\jour%prevd%%prevm%.dh0  w:\nbumail\journal\ *.*
     
    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=%1
    set fm=%2
    set fy=%3
    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 c:\oss.452\%4 c:\tcpfoss.452\jnin\
    copy c:\oss.452\log\%4 c:\tcpfoss.452\jnin\
    copy c:\oss.ie\%4 c:\tcpfoss.kie\jnin\
    copy c:\oss.ie\key\*.* w:\nbumail\journal
    copy c:\oss.ie\log\%4 c:\tcpfoss.kie\jnin\
    copy c:\oss.ie\key\*.* w:\nbumail\journal
    move c:\oss.452\%4 w:\nbumail\journal
    move c:\oss.452\log\%4 w:\nbumail\journal
    move c:\oss.ie\%4 w:\nbumail\journal
    move c:\oss.ie\log\%4 w:\nbumail\journal
    )
     

     

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



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

    Цитата:
    А где можно указать каталог из которого он обрабатывает файлы

    В начале батника определи переменную workdir, перейди в эту директорию, а в конце вернись в ту, в которой был:

    Код:
     
    set workdir=c:\temp
    pushd %workdir%
    ...
    ...
    popd
     


    Цитата:
    И еще он чего то повторяет свои действие в чем может быть причина

    Смотря какие действия - некоторые он должен повторять. Он же проверяет каждый файл по отдельности.
     
    Добавлено:

    Цитата:
    А проверте батничек  

    Проверить достаточно проблематично - у нас же нет твоих файлов и структуры директорий. На первый взгляд все нормально, кроме строчки "cd w:\nbumail\journal" - если ты находишься на другом диске, эта команд не сработает. Нужно написать "cd /d w:\nbumail\journal". На самом деле это не важно, так как ты используешь полные пути к файлам. Что такое "start %time%"?

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста:
     
    В Win2000 можно командой (батником) выключить (перезагрузить) ПК?
    (команды shutdown тут нет...)

    Всего записей: 686 | Зарегистр. 19-04-2005 | Отправлено: 22:33 15-01-2007
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    stalker0
    ну это не команда, а утилита, попроси ее у кого-нибудь, в конце концов не так уж много она весит, и пользуй на здоровье

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 22:43 15-01-2007
    Smitis



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    stalker0
    Или скачай с SysInternals.com утилиту psshutdown (входит в состав pstools). У неё возможностей больше.

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



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

    Цитата:
    Что такое "start %time%"?

    Это время начало работы

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



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

    Цитата:
    @echo off  
    setlocal enabledelayedexpansion  
    if exist ftemp.txt del /q ftemp.txt  
    for /f "tokens=*" %%I in (filename.ext) do (  
    set fname=%%I  
    echo !fname:~5,-8!>>ftemp.txt  
    )  
    del /q filename.ext  
    ren ftemp.txt filename.ext  

     
    Очень понравился это код который написал [/bElroir
    [/b].
     
    Нельзя ли его прокоментировать? В частности !fname:~5,-8!
    Как эта строка выбирает удаляет первые 5 и последние 8 символов?
    Что значит символ "!" ?

    Всего записей: 27 | Зарегистр. 02-11-2004 | Отправлено: 11:12 16-01-2007
    Elroir



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

    Цитата:
    В частности !fname:~5,-8!  
    Как эта строка выбирает удаляет первые 5 и последние 8 символов?  
    Что значит символ "!" ?

    Имеем переменную fname, в которую подставляем значение переменной %%I в каждом цикле for-а. В обычном случае, чтобы узнать значение переменной окружения, надо воспользоваться конструкцией %переменная%. Однако, если значение переменной меняется внутри цикла и читается там же, то для корректной работы батника, нужно использовать команду setlocal enabledelayedexpansion и вместо символа "%", использовать символ "!". Иначе, значение переменной в цикле будет всегда одним и тем же - таким, каким было до входа в цикл.
    При работе с переменными окружения, чаще всего, мы используем их как строчки. Часто нам нужно выделить из строчки какую-нибудь подстрочку. Для этого можно использовать конструкцию %var:~n% или %var:~n,m%. В первом случае мы получаем подстрочку начиная с n-ого символа и до конца строки, во втором подстрочку начинающуюся  с n-ого символа и заканчивающегося символом с номером m. Нумерация ведется с 0. Если число со знаком минус, то отсчет ведется с конца строки. Таким образом !fname:~5,-8! отсчитывает 5 символов с начала строки, которая находится в переменной fname, отсчитывает 8 символов с конца и мы получаем подстрочку fname, ограниченную этими условиями.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 13:56 16-01-2007 | Исправлено: Elroir, 19:31 17-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