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

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

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

vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:54 27-04-2007 | Исправлено: Elroir, 03:59 10-09-2007
    hacsoft

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Организация цикла с условием
     
    Задача: создать цикл с условием (типа while)
     
    Очевидный вариант решения (перекочевывает из Basic):

    Код:
    :loop
    <операции1>
    if <условие> <выход>
    <операции2>
    goto loop

    Т.е. по сути формируем бесконечный цикл, который при выполнении условия <условия> завершает свою работу.
    К сожалению, скорость работы такого цикла очень низкая из-за goto. Есть другой вариант, раз в 100 быстрее первого (по результатам проведенных замеров):

    Код:
    for /l %%a in (0,0,1) do (
      <операции1>
      if <условие> <выход>
      <операции2>
    )

    Но вот в чем пробела: как организовать выход из такого цикла? Пробовал так:

    Код:
    for /l %%a in (0,0,1) do (
      <операции1>
      if <условие> goto end
      <операции2>
    )
    :end

    Не работает.

    Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 19:05 29-07-2007
    Tipulatoid



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

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set file=poem.txt
    for /f "skip=1 delims=[]" %%a in ('find /n "Страсти её усмири," %file%') do set start=%%a
    for /f "skip=1 delims=[]" %%a in ('find /n "Будет тихонько дремать" %file%') do set end=%%a
    set count=0
    for /f "tokens=*" %%a in (%file%) do (
       set /a count=!count!+1
       if /i !count! lss %start% echo %%a>>new.txt
       if /i !count! gtr %end% echo %%a>>new.txt
    )


    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 19:12 29-07-2007
    Elroir



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

    Цитата:
    Пробовал ... Не работает

    Очень странно, что не работает. У меня работает следующая конструкция:

    Код:
     
    @echo off
    for /l %%a in (0,1,20) do (
    echo %%a
    if %%a==10 goto end
    echo %%a
    )
    :end
     

    У тебя появляется сообщение о непредвиденном появлении скобки?
     
     
    Добавлено:
    Я поторопился - если использовать (0,0,1), тогда не работает - не выходит из цикла.
    А если ставить (0,1,1000000), то происходит интересная вещь - на цифре 10 обработка команд внутри скобок for прекращается, но сам for продолжает бежать до 1000000 и только после этого отдает управление.

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 21:20 29-07-2007 | Исправлено: Elroir, 21:22 29-07-2007
    hacsoft

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Странно, что в случае с FOR происходит такое же зависание, если вместо goto указать EXIT /B.
    А если указать просто EXIT - батник захлопнется.
    Какие еще варианты прерывания цикла можно придумать?

    Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 23:20 29-07-2007
    dSasha

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Проблема: есть выход в интернет по мобильнику и доступ на несколько адресов бесплатно по диал-ап. В этой теме нашел, как добавлять маршруты bat-файлом. Всё бы хорошо, только часто рвётся диал-ап соединение. И, хотя и стоит галка "Перезвонить при разрыве связи", и перезванивает, но если я этого не заметил и не запустил bat-ник после этого, трафик идёт через основной шлюз и снимает деньги с мобильного счёта.
     
    Надо: чтобы после переподключения bat-ник запускался автоматически.  
     
    Если где-то есть готовый ответ - не ругайте, и так пока искал намотал дорогущего  трафика. Дайте, пожалуйста, подсказку или ссылку. Заранее спасибо.

    Всего записей: 30 | Зарегистр. 15-06-2007 | Отправлено: 01:23 30-07-2007
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Наиболее быстро и относительно корректно сработал этот код
    test.cmd
    Код:
    @echo off
    setlocal enabledelayedexpansion
    set input=
    set output=
    if exist %output% del %output%
     
    for /f "delims=" %%i in ('more/p/s "%input%"') do (
        set string=%%i
        if "!string!"=="строка_начала" goto:next
        echo !string!>>%output%
        )
    :next
    set /a count=0
    for /f "delims=" %%i in ('more/p/s "%input%"') do (
        set string=%%i
        if "!string!"=="строка_окончания" goto:res
        set /a count+=1
        )  
    :res
    for /f "skip=%count% delims=" %%i in ('more/p/s "%input%"') do (
        set string=%%i
        echo !string!>>%output%
        )
     

    Входной файл в кодировке utf-8, полутораметровая база данных sql, содержит подчас очень сложные и объемные строки с различными символами.
    Процентов на 95% файл обработался примерно за минуту amd2400xp+(512ram)
    В остальном налицо ошибка со знаками !<> и т.д.
    Остальные коды работают очень долго и менее корректно...
    Есть какие-нить мысли по доработке?

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 04:13 30-07-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Nagual
    У тебя в коде каждая строка сравнивается со
    Цитата:
    строка_начала
    и
    Цитата:
    строка_окончания
    , поэтому батник работает медленно. И вообще, код немного неудачно написан (с точки зрения производительности), два перехода по метке существенно замедляют работу батника.
    Тебе нужно выдрать блок строк из файла? Приведи фрагмент файла.
       
    P.S. Я приводил пример: http://forum.ru-board.com/topic.cgi?forum=62&topic=10650&start=1320#21 нужно просто немного переделать под свою задачу.

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 08:08 30-07-2007 | Исправлено: Maza Faka, 08:09 30-07-2007
    VASTERIKS

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вопрос мой остался без внимания. Разве это не решаемая задача
     

    Цитата:
    Доброго времени суток.  
     
    Итак, необходимо с известной папки собрать логи в архив и отправить на известный адрес для обработки!  
     
    Все рабочие файлы для этой задачи лежат в папке на флэшке. Флэшка передаётся юзеру, тот запускает один файл и работает себе дальше...  
     
    Вот что получилось :  
     
    start.bat  
     

    Код:
    Код:@echo off  
    start rar a -ep1 -y -hp123 arhlog "%programfiles%\prog\logdir\*.txt"  
    cmd /C send.bat  

     
    send.bat  
     

    Код:
    Код:blat -to mylo@mail.ru -attach arhlog.rar
     
     
    Файл не отправляется, окошко отправки висит от минуты до 3х. (архив получается до 30кб)  
     
    Где ошибка???

    Всего записей: 9 | Зарегистр. 10-05-2007 | Отправлено: 10:55 30-07-2007
    KapralBel



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    VASTERIKS
    Если руками запустить
    blat -to mylo@mail.ru -attach arhlog.rar
    Срабатывает?

    Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 11:00 30-07-2007
    VASTERIKS

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Нет. Я так пробовал. Наверное что то с Blat-ом. Так записывается когда в реестр занесены сведения на ящик. А мне скорее надо чтобы сведения в файле были. Чтобы не заносить в реестр каждой машины данные ящика
     
    Добавлено:
    Вот нашёл http://www.blat.net/syntax/syntax.html но чего то не получатся

    Всего записей: 9 | Зарегистр. 10-05-2007 | Отправлено: 11:09 30-07-2007
    KapralBel



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    VASTERIKS
    Скачай http://download.dataenter.co.at/ftp/demk/smtpsend.zip (~800kb)

    Код:
    SMTPSend -tmylo@mail.ru -fFrom@Email.Ru -hLocalhost -aarhlog.rar  

    Вместо Localhost поставишь АйПи или имя почтового сервера

    Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 11:26 30-07-2007
    VASTERIKS

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SmtpSend надо устанавливать. Мне то надо чтобы обойтись тем что будет на флэшке без установок
     
    Может всё же с Blat-ом кто-то сталкивался???

    Всего записей: 9 | Зарегистр. 10-05-2007 | Отправлено: 12:13 30-07-2007
    KapralBel



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

    Цитата:
    SmtpSend надо устанавливать

    Шо ты такое говоришь ??
    Наверное я с ним неверно обращаюсь
    Это просто

    Цитата:
    SMTPSend is an program for Windows 2000, NT , Win95 and Win98 that sends
    messages from the command line or from batch files to an SMTP address.
     

    Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 12:19 30-07-2007
    VASTERIKS

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    По ссылке  http://download.dataenter.co.at/ftp/demk/smtpsend.zip (~800kb) НотФаунд.
    Я по названию нашёл и скачал exe-шник таким же объёмом (http://www.geocities.com/mdrapps/smtpsend)... вот он устанавливается
     
    Может мне другой файл нужен?

    Всего записей: 9 | Зарегистр. 10-05-2007 | Отправлено: 12:24 30-07-2007 | Исправлено: VASTERIKS, 12:25 30-07-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KapralBel
     
    можно вопрос по моей теме?
     
    можно ли сделать так чтобы при удалении первых файлов backup001, backup002 продолжало создавать следующие номера, а по достижении 100 или 999 начинало с 001,  
    я хочу удалять первые по прошествию некоторого времени.

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 12:28 30-07-2007
    KapralBel



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    VASTERIKS
    сайт у них лежит
    если надо могу выслать
     
    кинь мне в ПМ свой е-майл
     
    Добавлено:
    JohnRD
    Так мой батник и расчитан на это
    Он начинает проверять с 001, 002 - отдает первый, пустой номер

    Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 12:29 30-07-2007
    wolf0425



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

    Цитата:
    можно ли сделать так чтобы при удалении первых файлов backup001, backup002 продолжало создавать следующие номера, а по достижении 100 или 999 начинало с 001

    по достижении 999 начинает с 000 - годится?
    в каталоге не должно быть посторонних файлов, попадающих под маску  backup???.gho
    (это ограничение при необходимости можно обойти но imho незачем)

    Код:
    @echo off
     
    for /f "tokens=1*" %%a in ('dir /b /o-d backup???.gho') do set "lastname=%%~na" && goto :newname
    :newname
    set /a newname=1%lastname:~-3% + 1
    if not defined newname echo Error: invalid filename found && goto :eof
    set newname=backup%newname:~-3%.gho
    set newname
     

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 13:01 30-07-2007 | Исправлено: wolf0425, 17:46 30-07-2007
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka
    Задача: удалить раздел из файла
    >test.cmd
    >Exit code: 0    Time: 50.216
    Вот цитата при сравнении исходника и конечного файла

    Цитата:
    Эти файлы имеют различные типы меток конца строки

    пример строки, которая не была обработана.
    Проблемы со спец символами и различными концами строк остались.
    По идее алгоритм думаю должен быть такой:
    найти начальную строку, присвоить ей ее номер
    найти конечную строку, присвоить ей ее номер
    отобразить текст от начала файла до начальной строки и записать в новый файл
    отобразить текст от конечной строки до конца файла и дописать в новый файл

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 13:07 30-07-2007 | Исправлено: Nagual, 13:21 30-07-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KapralBel
     
    вот например уже есть файлы
    backup001.gho
    backup002.gho
    backup003.gho
    backup004.gho
     
    как только 001 удаляешь файл, скрипт уже начинает с 001 далее продолжает 005
    а чтобы продолжал по номерам до 100 или 999 несмотря на то что 001 002 003 будут удалятся

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 13:12 30-07-2007
    KapralBel



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    JohnRD
    Т.е. надо при определенных условиях давать новый номер, а при другом условии создавать нумерацию с начала, не обращая внимание на существование файла?

    Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 13:18 30-07-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

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


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru