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

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

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

vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

   

vu1tur



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

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
 
Для перекодирования кирилицы 866<<>>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 12:40 25-01-2010 | Исправлено: bomzzz, 13:37 20-08-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    joker56
    какие условия вызова
    Цитата:
    одного или другого EXE-файла,
    ?

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 16:45 15-06-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    joker56
    то есть если размер LOG-файла меньше 1 kb то одно действие, если больше или равно то другое? Или надо сначала узнать размер LOG-файла и принять его за константу и отслеживать больше или меньше ? Также можно в этом логе искать слово и по его наличию действие.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 17:01 15-06-2010 | Исправлено: king_stiven, 17:04 15-06-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    joker56
    Набросал батник.  Отслеживает изменения размера указанного файла.
    Соответственно добавь в нужных местах вызовы своих exe.

    Код:
    @echo off
    set "scandir=d:\1"
    set "fname=test.log"
    set "fsave=save.dat"
    set /p save=<%fsave%
    for /F "tokens=1-5" %%a in ('dir /-c %scandir% ^| findstr %fname%') do (
        if "%save%"=="%%c" (
            echo файл не изменился
        ) else (
            echo файл изменился
            echo.%%c>%fsave%
        )
    )

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 17:04 15-06-2010 | Исправлено: res2001, 17:12 15-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    joker56
    Цитата:
    Из bat-файла нужно периодически анализировать изменение размера папки и в результате этого осуществлять переход на вызов одного или другого EXE-файла, уже находящих на компьютере. Похоже строк не много, но я практически не владею синтаксисом, может кто-нибудь помочь?
    по постановке - может все не размер папки отслеживать, а размер самого файла?
    отслеживать именно размер папки тоже можно, но тебе вроде незачем.
     
    вот, должно каждые 10 сек проверять не изменилась ли длина файла лога за прошедшее время.
    Если считаешь что пауза велика - сделай покороче, такой цикл совсем без паузы тебе наверно не нужен :)

    Код:
    @echo off
    call :_size "c:\1\your file.log"
     
    :loop
    set "_oldsize=%_newsize%"
    call :_size "c:\1\your file.log"
    if %_oldsize% neq %_newsize% echo different & goto :loop
    echo :equal  
    ping localhost -n 11 >nul
    goto :loop
     
    :_size
    set /a _newsize=%~z1 +0
    exit /b
    отсутствие файла лога считается штатным случаем с нулевой длиной файла.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 17:16 15-06-2010 | Исправлено: wolf0425, 17:33 15-06-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    пинг надо в начало цикла влепить, иначе в случае different задержки не происходит

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 17:31 15-06-2010
    wolf0425



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

    Цитата:
    иначе в случае different задержки не происходит
    да я его специально только в ветку equal  перенес, считая что изменяется файл не очень то часто.
    может и неправ, сильно зависит от того для чего конкретно отслеживается размер.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 17:38 15-06-2010 | Исправлено: wolf0425, 17:39 15-06-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    joker56у то надо запускать какие-то обработчики видимо, в таком виде получится что один за одним запустится обработчик изменений и обработчик отсутствия изменений, а это скорее всего не есть хорошо, они могут и конфликтовать начать с дуру.
    Конечно можно startом запускать с ожиданием, но похоже joker56 с этим не совладает
    Отличный у тебя способ нахождения размера файла, я не додумался так сделать  
    С диром, канечна, изврат.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 17:51 15-06-2010
    wolf0425



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

    Цитата:
    joker56у то надо запускать какие-то обработчики видимо, в таком виде получится что один за одним запустится обработчик изменений и обработчик отсутствия изменений, а это скорее всего не есть хорошо, они могут и конфликтовать начать с дуру.  
    да я как-то надеюсь что батник ждет окончания обработки в обоих случаях, и никуда не идет.
    так что всегда работает либо один из обработчиков либо батник.
    так что вопрос нужности паузы после обработки обнаружения изменений - пусть joker56 сам решает, тему читать вообще невредно.

    Цитата:
    Конечно можно startом запускать с ожиданием, но похоже joker56 с этим не совладает
    да научим, если спросит.
    не факт  вообще что обработчики отдельным процессом запускаются, а не такие же консольные.

    Цитата:
    Отличный у тебя способ нахождения размера файла, я не додумался так сделать  
    можно вместо call решить через for, писанины примерно столько же.
    просто с call можно сразу какую-то обработку влепить, не страдая от ограничений на %переменные%
    только тут с for пришлось бы делать отдельный код для случая исчезновения файла

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 19:05 15-06-2010 | Исправлено: wolf0425, 21:10 15-06-2010
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Работает у кого-нибудь? *тут ржущий смайлик*
    http://bolknote.ru/2010/06/13/~2566
     
    А то у меня nslookup не проходит толком(из-за маршрутизатора на 192.168.0.1 что-ли?)

    Цитата:
    *** Can't find server name for address 192.168.0.1: Timed out
    *** Default servers are not available

    Пару строчек гимна только выдал разок.

    Всего записей: 1705 | Зарегистр. 08-12-2004 | Отправлено: 01:06 16-06-2010 | Исправлено: igor_andreev, 01:06 16-06-2010
    wolf0425



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

    Цитата:
    А то у меня nslookup не проходит толком(из-за маршрутизатора на 192.168.0.1 что-ли?)  
    а что маршрутизатор? проблема скорее в сервере dns, у меня гугл - после энного прогона таки начал выдавать текст без ошибок.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 01:51 16-06-2010 | Исправлено: wolf0425, 01:55 16-06-2010
    res2001



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

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 09:04 16-06-2010
    barsikline



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Почему используя ftp.exe при попытке сменить каталог (cd) имя которого заканчивается на букву "Я" - пишет, что такой каталог не найден!? Чё делать?

    Всего записей: 33 | Зарегистр. 24-10-2008 | Отправлено: 09:24 16-06-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    barsikline
    а какой ftp сервер используешь?  
    Может у него хронические проблемы с русскими каталогами/файлами.
     
    Добавлено:
    попробуй другим ftp клиентом, например far или total. Надо определить на чьей стороне проблема клиента или сервера.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 09:28 16-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    barsikline
    Цитата:
    Почему используя ftp.exe при попытке сменить каталог (cd) имя которого заканчивается на букву "Я" - пишет, что такой каталог не найден!? Чё делать?
    переключаться в кодировку 1251 заранее, батник тоже сохранять в виндовой. примерно так:

    Код:
    @echo off
    chcp 1251  
    (echo user anonymous anonymous
     echo ls
     echo cd "/Инструкция/"
     echo pwd
     echo bin
     echo get file.tst
    ) | ftp -n localhost  

    res2001 проблема на стороне rfc - код 0xFF - служебный  
     
     

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 10:10 16-06-2010 | Исправлено: wolf0425, 10:44 16-06-2010
    yahan2



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите как получить код завершения первой команды, если ее вывод передается другой?
    Например, если есть такая конструкция:

    Код:
    7za.exe a 1.ZIP C:\WORK | tee -a mybackup.log
    if errorlevel 1 goto err_arch

    то errorlevel будет содержать не код завершения работы  7za.exe, а код завершения tee, т.о. нужная мне ошибка не отлавливается

    Всего записей: 112 | Зарегистр. 20-10-2005 | Отправлено: 10:45 16-06-2010 | Исправлено: yahan2, 10:46 16-06-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    yahan2
    ну значит надо команды разделять, вывод первой записывать в промежуточный файл, проверять errorlevel, а потом файл подавать на вход второй.
    Как то так:

    Код:
    7za.exe a 1.ZIP C:\WORK >temp.log
    if errorlevel 1 goto err_arch
    type temp.log | tee -a mybackup.log

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 10:48 16-06-2010
    yahan2



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Разделять не интересно, дело в том, что время архивации большого массива данных может занимать достаточно много времени. Надо видеть что происходит в данный момент и одновременно создавать лог в файл (что и делает tee).
     
    Если делать вашим методом, то вначале происходит архивация, а потом содержимое лога быстро вываливается на экран.
     
    Как вариант вижу - анализ результирующего лога с помощью find, но это как-то через одно место, не надежно и медленно, хотелось бы просто проверить код ошибки архиватора.

    Всего записей: 112 | Зарегистр. 20-10-2005 | Отправлено: 11:01 16-06-2010 | Исправлено: yahan2, 11:06 16-06-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    yahan2
    А что если архивацию выделить в отдельный батник. После архивации в этом батнике вывести errorlevel.
    Тогда вызов в родительском бат будет такой:
    call arc.bat | tee -a mybackup.log
    а потом уже findом ищем вхождение в лог файле errorlevel.
     
    Добавлено:
    можно выделять не в батник, а оформить процедурой.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 11:41 16-06-2010
    wolf0425



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

    Цитата:
    Подскажите как получить код завершения первой команды, если ее вывод передается другой?
    код - вроде никак, ошибку отловить - типа так:

    Код:
    (7za.exe a 1.ZIP C:\WORK || cd . 2>err.flag )| tee -a mybackup.log  
    if exist err.flag goto err_arch  
     

    Добавлено:

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

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 11:58 16-06-2010 | Исправлено: wolf0425, 12:09 16-06-2010
    res2001



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

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

    errorlevel запишется в лог и оттуда его можно выдернуть:
     

    Код:
    @echo off
    call :arh | tee -a mybackup.log
    for /f "tokens=1 delims==" %%i ('find "ERRORLEVEL=" mybackup.log') do (
    if %%i==0 ( echo Архивация успешна) else echo Ошибка архивации
    )
     
    :arh
    "C:\Program Files\7-Zip\7z.exe" a test c:\work
    echo ERRORLEVEL=%ERRORLEVEL%
    exit /b
     

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 12:25 16-06-2010 | Исправлено: res2001, 12:42 16-06-2010
       

    Страницы: 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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 8
    vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru