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

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



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

    Мальчики, только не ссортесь, плз. В любом случае вы мне очень сильно подсобили! Не предполагала, что в выходной будут такие плотные ответы. Я то ведь за вами не поспеваю...
     
    yurkesha
    А как бы ты эту конструкцию изобразил бы:

    Код:
    reg query "Раздел\подрадел" 2>nul
    if %errorlevel%==0 reg delete "Раздел\подраздел" /F >Nul

    ?

    Всего записей: 585 | Зарегистр. 20-05-2007 | Отправлено: 13:34 20-05-2007
    wolf0425



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

    Цитата:
    Не понимаю почему ты так кипятишься?  

    да просто я автор вполне конкретного батника, по которому Angel_Ka вопросы задавал...
    и хотя времени на доработку накопившихся замечаний нет - за неплохой в общем-то батник и совершенно бессмысленую критику - обидно.
     
    можешь написать лучше  (батник целиком) - напиши, на форуме ФАРа много людей скажет спасибо, благо что мой батник писался действительно под себя и левой ногой - кое чего людям не хватает.
    а критиковать использованные связки команд ради абстрактной правильности в отрыве от контекста, ничего не предлагая взамен - много ума не надо...

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 13:41 20-05-2007 | Исправлено: wolf0425, 13:47 20-05-2007
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не принимай близко к сердцу - я не имел в виду ничего обидного.
    Прости если обидел!
    А насчет errollevel - ошибки должны генериться в одном потоке. Для примера создадим такой (ошибочный заведомо код):

    Код:
    reg query &Раздел\подрадел"
    echo %errorlevel%


    ----------
    Всем непричастным рекомендую прогулки на свежем воздухе

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 13:49 20-05-2007
    wolf0425



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

    Цитата:
    создадим такой (ошибочный заведомо код):  

    получаем код ошибки 9009.
    надеюсь ты не будешь настаивать на интерпретации, что случилось 9 тысяч ошибок?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 13:52 20-05-2007 | Исправлено: wolf0425, 14:04 20-05-2007
    Angel_Ka



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

    Цитата:
    да просто я автор вполне конкретного батника, по которому Angel_Ka вопросы задавал...  

    А я то всё думала не случайно ли совпадение ников? Кстати, писали Вы тот архиполезный батник по просьбе моего очень хорошего знакомого. Только Вы ему об этом не сообщайте, плз... Он вообще-то большой энтузиаст Far и если бы не он, то кто знает... А Ваш батник он называет не иначе как чудесным. Кстати, он придумал переименовать Far.exe в pFar.exe и тогда "переносная" и "столовая" (так он их обзывает) версии Far не пересекаются. Думаю, что он не обидится, что я выдала его секрет.  

    Всего записей: 585 | Зарегистр. 20-05-2007 | Отправлено: 14:04 20-05-2007 | Исправлено: Angel_Ka, 15:23 20-05-2007
    KWladimir

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    2 renreg:
    PStart
    http://www.pegtop.net/start/

    Всего записей: 3 | Зарегистр. 20-05-2007 | Отправлено: 14:23 20-05-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    кстати о %errorlevel% и reg.exe
    стандартные коды ошибок описаны тут
    про то, какие коды будут в случае некорректных операндов - там ничего нет,
    а вот коды 0 1 и для некоторых команд 2 - документированы.
     
    ещё на тему errorlevel следует упомянуть, что  
    связка if errorlevel 1  вовсе не эквивалентно if %errorlevel%==1
    а связка || ... примерно соответсвует if errorlevel 1 (...) за исключением строк, вызывающих ошибку у cmd.exe

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 14:30 20-05-2007 | Исправлено: wolf0425, 14:31 20-05-2007
    Angel_Ka



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

    Цитата:
    кстати о %errorlevel% и reg.exe
    стандартные коды ошибок описаны тут

    Вот я получила ответ на вопрос, который задавала:

    Цитата:
    А не подскажете, где можно было бы прочесть про возвращаемые коды reg query по максимуму?
    Не ли ссылки?
    Гуд, очень гуд!
    Однако очень хорошо, что этот ответ получен после дискуссии! Не зря говорят, что нет худа без добра...

    Всего записей: 585 | Зарегистр. 20-05-2007 | Отправлено: 14:49 20-05-2007 | Исправлено: Angel_Ka, 14:55 20-05-2007
    wolf0425



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

    Цитата:
    я то всё думала не случайно ли совпадение ников

    0425 - это месяц и день, когда Maza Faka нашел для себя фаровский форум,
    попутно отрекламировав там этот

    Цитата:
    Только Вы ему об этом не сообщайте, плз

    надеешься, что этот форум сам он не читает?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 15:14 20-05-2007
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Еще чуток про errorlevel и заодно про разницу между .BAT и .CMD, хотя официально ее вроде как и нет.
    Запустить код как .bat, а потом как .cmd. Из ньюсов откуда-то когда-то скопипастил, вроде из microsoft.public.win2000.cmdprompt.admin, автор кажется тот же вумный дядька Herbert Kleebauer

    Цитата:
     
    There is a difference between .bat and .cmd. Execute the following
    code as a .bat and as a .cmd program:

    Код:

    @echo off
     
    set a=
    call :seterr
    echo errorlevel: %errorlevel%
    set a=
    echo errorlevel: %errorlevel%
     
    set a=
    call :seterr
    echo errorlevel: %errorlevel%
    set a=irgendwas
    echo errorlevel: %errorlevel%
     
    set a=igendwas
    call :seterr
    echo errorlevel: %errorlevel%
    set a=
    echo errorlevel: %errorlevel%
     
    goto :eof
     
    :seterr
    exit /b 10

    и добавка от "Mark Zbikowski \(MSFT\)" <MarkZ[at]online.microsoft.com>

    Цитата:
    The differences between .CMD and .BAT as far as CMD.EXE is concerned are:
     
    With extensions enabled, PATH/APPEND/PROMPT/SET/ASSOC in .CMD
    files will set ERRORLEVEL regardless of error. .BAT sets ERRORLEVEL
    only on errors.

    Всего записей: 1705 | Зарегистр. 08-12-2004 | Отправлено: 15:19 20-05-2007
    Angel_Ka



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

    Цитата:
    0425 - это месяц и день, когда Maza Faka нашел для себя фаровский форум,
    попутно отрекламировав там этот

    А там у него такой же неприглядный ник?

    Цитата:
    надеешься, что этот форум сам он не читает?
     
    КУ-КУ!!!
     
    Сэнкс. Перечла записи. Вроде бы всё пристойно. Какая я молодец...
     
     
    Добавлено:
    igor_andreev

    Цитата:
    Еще чуток про errorlevel и заодно про разницу между .BAT и .CMD ...

    Можно то же по русски? И помедленнее... я записываю!

    Всего записей: 585 | Зарегистр. 20-05-2007 | Отправлено: 15:21 20-05-2007 | Исправлено: Angel_Ka, 15:29 20-05-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igor_andreev спасибо, классный примерчик.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 15:41 20-05-2007
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    у меня код
    @echo off
    reg query &Раздел\подрадел"
    echo %errorlevel%
    pause
    выдает
    Ошибка: Слишком мало параметров в командной строке.
    Системе не удается найти указанный путь.
    3
    код, приведенный igor_andreevым выдает
    errorlevel: 10
    errorlevel: 0
    errorlevel: 10
    errorlevel: 0
    errorlevel: 10
    errorlevel: 0
    непонятно зачем там
    goto :eof
    для отладки кода не годится совсем, поэтому перед ним поставил pause
    тема интересная, есть ли универсальный пример по отлову всех возможных ошибок любой команды?

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 15:55 20-05-2007
    Angel_Ka



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

    Цитата:
    igor_andreev спасибо, классный примерчик.

     
    А я не поняла, что это значит:
     

    Код:
    B:\>igor.bat
    errorlevel: 10
    errorlevel: 1
    errorlevel: 10
    errorlevel: 10
    errorlevel: 10
    errorlevel: 10
     
    B:\>igor.cmd
    errorlevel: 10
    errorlevel: 1
    errorlevel: 10
    errorlevel: 0
    errorlevel: 10
    errorlevel: 0

     
    Хоть кто ни-будь, хоть намекните, что это значит? Ведь все команды одни и те же! А почему результаты разные? Это глюки?

    Всего записей: 585 | Зарегистр. 20-05-2007 | Отправлено: 15:57 20-05-2007 | Исправлено: Angel_Ka, 16:04 20-05-2007
    Elroir



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

    Цитата:
    непонятно зачем там goto :eof  
    для отладки кода не годится совсем, поэтому перед ним поставил pause  

    Для отладки надо запускать скрипт в консольном окне, а не из эксплорера.  

    Цитата:
    есть ли универсальный пример по отлову всех возможных ошибок любой команды?

    Нет.

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

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



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

    Цитата:
    А я не поняла, что это значит:  

    это хорошо иллюстрирует
    Цитата:
    With extensions enabled, PATH/APPEND/PROMPT/SET/ASSOC in .CMD files will set ERRORLEVEL regardless of error. .BAT sets ERRORLEVEL only on errors.

    10 - это специально устанавливаемый код,
    после чего идет set в трех вариантах: переменная не определена, изменяется и уничтожается ранее определенная.
    в cmd - errorlevel всегда соответствует последней исполненной команде set: 1 если такой переменной ранее не было, 0 в остальных случаях.
    в bat - комынды set с предустановленной ранее переменной не вызывают изменения текущего errorlevel, т.е. т.е. для него успешных команд set как будто и не было и errorlevel от идущей до set команды сохраняется неизменным, изменяется он только теми set, которые имеют ненулевой errorlevel (например вводят новую переменную)...
     

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 16:13 20-05-2007 | Исправлено: wolf0425, 16:19 20-05-2007
    Elroir



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

    Цитата:
    Хоть кто ни-будь, хоть намекните, что это значит? Ведь все команды одни и те же! А почему результаты разные? Это глюки?  

    Это демонстрация разницы между .cmd и .bat файлами.  
    Перевод последней цитаты igor_andreev-а:
    Если разрешены расширения (команд), команды PATH/APPEND/PROMPT/SET/ASSOC в .CMD будут устанавливать код ошибки (errorlevel) независимо от того, произошла какая-либо ошибка при работе или нет. В .BAT код ошибки будет устанавливаться только в том случае, когда в процессе работы произошла ошибка.

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

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



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

    Цитата:
    в cmd - errorlevel всегда соответствует последней исполненной команде: 1 если переменной ранее не было, 0 в остальных случаях.
    в bat - комынды set с предустановленной ранее переменной не вызывают изменения текущего errorlevel - т.е. для него успешных команд set как будто и нет...  

    Другими словами .cmd консоль обрабатывает вернее чем .bat ...  
     
    Сэнкс!
     
    Elroir
     

    Цитата:
    Перевод последней цитаты igor_andreev-а:
    Если разрешены расширения (команд), команды PATH/APPEND/PROMPT/SET/ASSOC в .CMD будут устанавливать код ошибки (errorlevel) независимо от того, произошла какая-либо ошибка при работе или нет. В .BAT код ошибки будет устанавливаться только в том случае, когда в процессе работы произошла ошибка.

    А вот это опять не ясно. Звучит противоположно тому как я поняла. Но ведь на деле результаты из .cmd правильнее, чем из .bat?
     
    Так... Молчание - золото. Типа: "отвяжись, дура, а то уже пятый час".  Ну что ж. По домам.

    Всего записей: 585 | Зарегистр. 20-05-2007 | Отправлено: 16:18 20-05-2007 | Исправлено: Angel_Ka, 16:42 20-05-2007
    Nagual



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

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

    Цитата:
    Нет.

    обидно

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 16:25 20-05-2007
    Elroir



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

    Цитата:
    обидно

    Чаще всего разработчик программы указывает в документации, какие коды ошибок возвращает программа в разных ситуациях.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 16:33 20-05-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