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

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



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

    Цитата:
    errorlevel запишется в лог и оттуда его можно выдернуть:  
    вот только tee -a - это запись лога с аппендом, так что выдернешь ты более одной строки ERRORLEVEL... и это может быть небыстрым.
     
    А неужели у тебя приведенный тобою код - работает???
    вызов 7z можешь для теста заменить на что-то , например на  dir \\\

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



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    код не рабочий, у меня не было tee для отладки.
    Сейчас нашел, поотлаживаю.

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



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

    Цитата:
    код не рабочий, у меня не было tee для отладки.  
    да там не в tee затык,
    а в том что call :label | anyprogram.exe - работать не будет, так как :label - не команда
    и ещё пара ошибок в синтаксисе for ...  
     
    и чем гемороиться со сканированием лога - проще флаговый файлик создать, пример на прошлой странице.

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



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    согласен и с меткой и с ошибками в коде.
    С дополнительным батником работает, проверил:
     
    test.bat:

    Код:
    @echo off
    call test1.bat | wtee mybackup.log
    for /f "usebackq tokens=2 delims==" %%i in (`find "ERRORLEVEL=" mybackup.log`) do (
    echo %%i
    if %%i==0 ( echo Архивация успешка) else echo Ошибка архивации
    )
     

     
    test1.bat

    Код:
    @echo off
    dir
    echo ERRORLEVEL=%ERRORLEVEL%
     

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



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

    Цитата:
    С дополнительным батником работает, проверил:
    ну вот ещё бы for переделал чтоб был совместим с tee -a...
    и потом сравнил количество геморроя с простым файловым флагом

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


    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 13:39 16-06-2010 | Исправлено: wolf0425, 13:43 16-06-2010
    res2001



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

    Цитата:
    Надо видеть что происходит в данный момент и одновременно создавать лог в файл (что и делает tee).  

    По моему мы оба не много не правы. yahan2 хочет чтоб во время архивации, все что 7z выдает он видел на экране с одновременным помещением в файл и вытаскиванием в конце errorlevel.
    В наших вариантах во время работы 7z на экран ничего выдаваться не будет, все сообщения 7z вылезут только когда за них возьмется tee, т.е. фактически после создания архива.

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



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

    Цитата:
    В наших вариантах во время работы 7z на экран ничего выдаваться не будет, все сообщения 7z вылезут только когда за них возьмется tee, т.е. фактически после создания архива.  
    а проверить - не судьба что-ли? паузу влепи вместо 7z или дир длинного каталога.  

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 13:44 16-06-2010
    res2001



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

    Цитата:
    и потом сравнил количество геморроя с простым файловым флагом  

    я уже сравнил.
    Только зачем в варианте с флагом "cd ." - не понял.
     
    Добавлено:
    wolf0425

    Цитата:
    а проверить - не судьба что-ли? паузу влепи вместо 7z или дир длинного каталога.  

    только что проверял, запустил 7z на каталог с большим файлом - пока шла упаковка на экране ничего не было.

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    res2001
    Какие вы все-таки замечательные люди, дай вам бог здоровья и всех благ.
    Я попробовал оба варианта - в варианте Res'а ПРИ ИЗМЕНЕНИЯХ файла почему то выводятся оба сообщения - и Файл изменился и Файл не изменился.
    В варианте Wolf'а но с советом Res'а перенести ping в начало цикла сразу после строчки :loop все работает в соответствии с заданием. К тому же, там я смогу изменять время задержки ( я правильно понял, что число 11 в строчке ping означает задержку в секундах?). Я прописал нужные мне исполнительные файлы (2.exe и 3.exe), все включается очень хорошо.
     
    @Echo Off
    call:_size "c:\1\test.log"
     
    :loop
    ping localhost -n 11>nul
    set "_oldsize=%_newsize%"
    call:_size "c:\1\test.log"
    if %_oldsize% neq %_newsize% start c:\2.exe & goto :loop
    start c:\3.exe
    goto :loop
     
    :_size
    set /a _newsize=%~z1 +0
    exit /b
     
    Единственное, что мне нужно уточнить - следить придется не за размером одного файла test.log а за размером всей папки C:\1 потому что программа, за которой надо следить, может создавать в этой папке новые файлы *.log, а отслеживать их нет смысла, да и гораздо сложнее, и размер .bat тоже критичен. Как изменить текст с этой целью?
    И еще - для своего развития - а где можно найти описания таких штучек, как % ^ | <> ~  и всяких слов типа ping localhost nul, которых нет в описаниях команд, выводимых при HELP <имя команды>?
     
    Еще раз большой респект и уважуха

    Всего записей: 3 | Зарегистр. 15-06-2010 | Отправлено: 13:49 16-06-2010
    wolf0425



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

    Цитата:
    Только зачем в варианте с флагом "cd ." - не понял.  
    NOP такой.
    нужна же какая-то команда чтоб файл создать. причем rem - не годится, а echo чего-то пишет в лог...

    Цитата:
    только что проверял, запустил 7z на каталог с большим файлом - пока шла упаковка на экране ничего не было.
    а, есть такое. но это уже не к нам вопрос,  
    7za a -r0 xxx E:\MiniSV.iso | tee -a mybackup.log тоже выплевывает на экран по окончании запаковки. т.е. проблема в tee  или в виндах.
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 13:57 16-06-2010
    res2001



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

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



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

    Цитата:
    ( я правильно понял, что число 11 в строчке ping означает задержку в секундах?).  
    почти правильно - это число должно быть на 1 больше чем нужная величина задержки в секундах.
    и поаккуратнее с пробелами -  
    ping localhost -n 11 >nul и ping localhost -n 11>nul  
    - не на всех системах сработают одинаково.
    но тут ещё я виноват, надо было не лениться и сразу писать  
    1>nul ping localhost -n 11

    Цитата:
    Единственное, что мне нужно уточнить - следить придется не за размером одного файла test.log а за размером всей папки C:\1 потому что программа, за которой надо следить, может создавать в этой папке новые файлы *.log, а отслеживать их нет смысла, да и гораздо сложнее, и размер .bat тоже критичен. Как изменить текст с этой целью?  

    перейти к тому что предлагалось в начале и что делал Res
    в отвязанном от региональных и языковых настроек варианте оно выглядит заметно более громоздко:

    Код:
    @echo off
    call:_size "c:\1\*.log"
     
    :loop
    1>nul ping localhost -n 11
    set "_oldsize=%_newsize%"
    call:_size "c:\1\*.log"
    if %_oldsize% neq %_newsize% echo start "" c:\2.exe & goto :loop
    echo start "" c:\3.exe
    goto :loop
     
    :_size
    for /f "tokens=3*" %%a in ('dir "%~f0"') do set "dir_txt=%%b"  
    for /f "tokens=3"  %%s in ('dir /a-d %1 ^| findstr /b /c:" " ^| find /v "%dir_txt%" ') do set "dir_txt=%%s"
    for /f "delims=0123456789" %%a in ("%dir_txt% ") do 1>file.txt call set "_newsize=%%dir_txt:%%a=%%"
    exit /b  
     
    в принципе тебе то можно на строчку сократить и сравнивать текстовое значение длины, а не числовое - но пусть так побудет чтоб рес учился

    Цитата:
    И еще - для своего развития - а где можно найти описания таких штучек
    в хэлпе
    hh ntcmds.chm::/filters.htm
    ping localhost -n 11  - известный полухакерский способ отработки задержек без нагрузки на процессор, есть модификации и для времени меньше секунды. весьма популярен в этой ветке.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 14:40 16-06-2010 | Исправлено: wolf0425, 14:53 16-06-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    joker56
    В моем варианте возможен вывод нескольких сообщений в случае наличия в каталоге похожих файлов типа: test.log1 test.log2 и т.п.
    Я подразумевал, что батник будет запускаться например через шедулер в нужное время с нужными интервалами, но можно прикрутить и цикл по аналогии с вариантом wolf0425.
     
    На счет сканирования каталога -  по моему вариант wolf0425 тут не прокатит, для каталога %~z1 все время возвращает 0.
    В моем варианте - элементарно
    Замени
    for /F "tokens=1-5" %%a in ('dir /-c %scandir% ^| findstr %fname%') do (  
     
    на  
    for /F "tokens=1-5" %%a in ('dir /-c %scandir% ^| findstr "файлов"') do (
     
    будет брать размер в выводе dir не конкретного файла, а итоговой строки для файлов
     

    Цитата:
    И еще - для своего развития - а где можно найти описания таких штучек, как % ^ | <> ~  и всяких слов типа ping localhost nul, которых нет в описаниях команд, выводимых при HELP <имя команды>?  

    Пуск->Помощь в строке поиска введи "перенаправление". Эти штуки называются операторами перенаправдения.
     
    Добавлено:
    joker56

    Цитата:
    в отвязанном от региональных и языковых настроек варианте оно выглядит заметно более громоздко:  

    Я бы не стал парится с отвязкой региональных настроек, потому что действительно очень громоздко. Ты же собираешься запускать этот батник на вполне конкретной системе с заранее известными региональными параметрами.

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Цитата:
    Цитата:
    в отвязанном от региональных и языковых настроек варианте оно выглядит заметно более громоздко:  
    Я бы не стал парится с отвязкой региональных настроек, потому что действительно очень громоздко. Ты же собираешься запускать этот батник на вполне конкретной системе с заранее известными региональными параметрами.
    да это не повод проверять/править текст батника при переносе на соседнюю систему, где dir /-c %scandir% | findstr "файлов" может запросто ничего не найти, когда эта возможная ошибка заранее устраняется одной строкой кода.
    или внимательно исследовать код для выяснения - какой же там пробел вбит, обычный или неразрывный...
    код в общем-то только выглядит страшненько, да и третий фор в данном случае только для красоты - он чтобы из строки число сделать. сравнивать на равенство можно и текст.
     
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 16:00 16-06-2010 | Исправлено: wolf0425, 16:14 16-06-2010
    joker56

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    res2001
    Друзья,  ваш "объединенный" Wolf'ом вариант замечательно выполняет нужную задачу. Убрал \*.log и слово echo перед start. Вот результирующий код для интересующихся.
     
    Задача:
    Анализ 1 раз ~ в 10 сек
    Если произошло изменение размера папки С:\1 то запускается файл C:\2.exe
    Если не произошло изменение размера папки С:\1 то запускается файл C:\3.exe
     
    Код ((с)Wolf0425 и res2001 ):
     
    @echo off  
    call:_size "c:\1"  
       
    :loop  
    1>nul ping localhost -n 11  
    set "_oldsize=%_newsize%"  
    call:_size "c:\1"  
    if %_oldsize% neq %_newsize% start "" c:\2.exe & goto :loop  
    start "" c:\3.exe  
    goto :loop  
     
    :_size  
    for /f "tokens=3*" %%a in ('dir "%~f0"') do set "dir_txt=%%b"  
    for /f "tokens=3"  %%s in ('dir /s/a-d %1 ^| findstr /b /c:" " ^| find /v "%dir_txt%" ') do set "dir_txt=%%s"  
    for /f "delims=0123456789" %%a in ("%dir_txt% ") do 1>file.txt call set "_newsize=%%dir_txt:%%a=%%"  
    exit /b
     
    Огромное спасибо!

    Всего записей: 3 | Зарегистр. 15-06-2010 | Отправлено: 16:12 16-06-2010
    res2001



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

     
    wolf0425

    Цитата:

    Код:
    for /f "delims=0123456789" %%a in ("%dir_txt% ") do 1>file.txt call set "_newsize=%%dir_txt:%%a=%%"

    оригинальный метод удаления разделителей

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



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

    Цитата:
    Убрал \*.log
    ну оставил бы хоть  \*
     
    держи укороченную версию чтоб res2001 меньше нудел

    Код:
    @echo off  
    call:_size "c:\1"  
       
    :loop  
    1>nul ping localhost -n 11  
    set "_oldsize=%_newsize%"  
    call:_size "c:\1"  
    if %_oldsize% neq %_newsize% start "" c:\2.exe & goto :loop  
    start "" c:\3.exe  
    goto :loop  
     
    :_size  
    for /f "tokens=3*" %%a in ('dir "%~f0"') do set "dir_txt=%%b"  
    for /f "tokens=3"  %%s in ('dir /-c /s/a-d %1 ^| findstr /b /c:" " ^| find /v "%dir_txt%" ') do set "_newsize=%%s"
    exit /b
     
     
    Добавлено:
    res2001

    Цитата:
    оригинальный метод удаления разделителей
    ты ещё скажи что метод отвязки от findstr "файлов" неоригинальный

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



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

    Цитата:
    ты ещё скажи что метод отвязки от findstr "файлов" неоригинальный

    оригинальный зачет
     
    Вот еще мысль по поводу флаг файла для yahan2:
    вместо cd . можно присвоить значение переменной. И обойдемся тогда вообще без дополнительных файлов.

    Код:
    ("C:\Program Files\7-Zip\7z.exe" a 1 d:\1 || set err=true )| wtee -a mybackup.log  
    if defined err (echo ERROR) else echo Ok
     

     
    Добавлено:
    wolf0425
    если в dir указать ключ /-c то разделителей в сумме не будет

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    wolf0425
    Спасибо, большое за помощь, но tee или cmd сами по себе как-то странно работают в винде
     
    "C:\Program Files\7-Zip\7z.exe" a 1 d:\1
    и
    "C:\Program Files\7-Zip\7z.exe" a 1 d:\1 | wtee -a mybackup.log
     
    совершенно по разному делают вывод на экран, во втором случае он идет как-то порциями (выдал и завис, потом опять выдал...)
    Придется отказаться от этой задумки.
     
    Добавлено:
    Еще один вопрос как проверить существование каталога?
    Если на месте каталога находится файл - то мне надо отловить эту ситуацию
     
    Я делаю так:
    if exist C:\dir_name\nul echo is_dir
     
    где C:\dir_name - имя проверяемого каталога.
    На локальных дисках эта проверка работает, а на сетевых, если dir_name это файл, то код возвращает true

    Всего записей: 112 | Зарегистр. 20-10-2005 | Отправлено: 18:22 16-06-2010
    wolf0425



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

    Цитата:
    если в dir указать ключ /-c то разделителей в сумме не будет
    да, чего-то я это место хэлпа пропустил.
     

    Цитата:
    Вот еще мысль по поводу флаг файла для yahan2:
    вместо cd . можно присвоить значение переменной. И обойдемся тогда вообще без дополнительных файлов.
    Код:
    ( dir \\\ || set err=true )| wtee -a mybackup.log  
    if defined err (echo ERROR) else echo Ok  
    ты опять работу кода не проверял
    но пример показателен тем, что монотонные ограниченные мысли - сходятся, я это проверял в самом начале. НЕ РАБОТАЕТ, установка err в таких скобках - ни на что снаружи скобок не влияет.  
    "такие" - это )|
     
    Добавлено:
    yahan2
    Цитата:
    Добавлено:
    Еще один вопрос как проверить существование каталога?  
    ну если в нем не тысячи файлов - то проще всего так
    Код:
    1>nul 2> nul dir /ad c:\dir1\ && echo c:\dir\ exist

    а если надо при отсутствии каталога его создать и что-то ещё по поводу предыдущего отсутствия сделать - то так:

    Код:
    2>nul md c:\dir1\ && copy c:\shablon.txt c:\dir1\  


    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 19:36 16-06-2010 | Исправлено: wolf0425, 23:59 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