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

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

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

vu1tur (09-01-2011 11:53): лимит страниц, продолжение — http://forum.ru-board.com/topic.cgi?forum=62&topic=22143  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 17:45 04-09-2010 | Исправлено: Accessor, 18:04 28-09-2010
    01MDM



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

    Цитата:
    но нужно прописывать путь к папке, а путь неизвестен получается.  


    Код:
     
    @echo off
     
    for %%i in (c d e f g h i j k l m n o p q) do if exist %%i: (
     
         for /f "tokens=*" %%j in ('dir /b /s /ad %%i:\*Detalizacia*') do rd /s /q "%%j"
     
    )
     


    Цитата:
    1) Как сделать задержку вывода на экнан?

    Перенаправлять вывод команд в nul. Батник выше вообще ничего не выводит.

    Цитата:
    А как сделать вывод переменной, процентов, в одной стоке

    Стандартно, что бы при этом сохранить буфер консоли, никак. Если это не важно, то  можно после каждого расчета процента (как будешь считать я не знаю), стирать содержимое консольного окна командой cls и выводить новый процент. Как вариант перезаписывать заголовок командой title:

    Код:
     
    @echo off
    for /l %%i in (0,1,100) do (
     
    cls
    title %%i%%
    echo %%i%%
    1>nul ping -n 1 localhost
     
    )
     
     
     
    Можно так же воспользоваться сторонними утилитами. Например ansicon, которая позволяет управлять консолью с помощью escape-последовательностей. Например можно организовать такой прогресс-бар:

    Код:
     
    @echo off
    setlocal
    echo.
     
    C:\BIN\ANSICON\ansicon -p
     
    set "esc="
     
    echo    DO  %esc%[8G0%%    [%esc%[s%esc%[20C] %esc%
     
    for /l %%i in (1,1,100) do call:progress %%i
     
    echo %esc%[u%esc%[2CDONE
    echo.
    goto:eof
     
    :progress
    set /a check=%1%%5
    if "%check%"=="0" echo %esc%[u#%esc%[s
    echo %esc%[1F%esc%[8G%1%%  
     
    nircmdc wait 50  
     

     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 16:18 28-10-2010 | Исправлено: 01MDM, 16:55 28-10-2010
    vitaliy91

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Почему-то в чистом MS-DOS 7 -  8  не работает errorlevel
    Ктонибудь знает почему ?

    Всего записей: 37 | Зарегистр. 16-11-2008 | Отправлено: 20:10 28-10-2010
    Accessor



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vitaliy91
    Что-то мне подсказывает, что Microsoft не допустила бы такой конфуз. Ищите ошибки со своей стороны.

    Всего записей: 2861 | Зарегистр. 31-10-2003 | Отправлено: 22:01 28-10-2010
    vitaliy91

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я уже по всякому пробывал. Интерпретатор просто игнорирует эту переменную
    например
    echo %errorlevel%
    ECHO is on
     
    if not errorlevel 0 echo err
    Ничего не выводится там где явно была ошибка

    Всего записей: 37 | Зарегистр. 16-11-2008 | Отправлено: 22:19 28-10-2010 | Исправлено: vitaliy91, 22:23 28-10-2010
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vitaliy91
    if not errorlevel 0
    в переводе если errorlevel меньше нуля, а меньше нуля он не бывает
    if errorlevel 1 echo errorlevel^>=1

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 22:37 28-10-2010
    king_stiven

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

    Цитата:
    ECHO is on  
     
    if not errorlevel 0 echo err

    в данном случае errorlevel реагирует на предыдущую команду, то есть на
     
    ECHO is on

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 22:38 28-10-2010
    smirnvlad

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    не уверен насчет доса, но у меня в win xp echo не меняет errorlevel

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 22:49 28-10-2010
    vitaliy91

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    При выполнении echo %errorlevel% должно выводится число возврата а выводится
    ECHO is on а это значит что переменная %errorlevel% пустая
     
    CD B:
    Invalid drive specification
    if not errorlevel==0 echo err
    Ничего не выводится
     
    if not %errorlevel%==0 echo err
    Syntax error (потому что переменная %errorlevel% пуста а должна хранить значение errorlevel)
     
    smirnvlad
     
    На XP все отлично работает но и в чистом досе эта переменная законспектирована и должна работать.
    Не работает в версиях 6.22, 7.0, 7.1, 8.0

    Всего записей: 37 | Зарегистр. 16-11-2008 | Отправлено: 23:00 28-10-2010
    king_stiven

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

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 23:15 28-10-2010 | Исправлено: king_stiven, 23:21 28-10-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vitaliy91
    Цитата:
    При выполнении echo %errorlevel% должно выводится число возврата а выводится
    ECHO is on а это значит что переменная %errorlevel% пустая  

    ЕМНИП псевдопеременная %errorlevel% появилась именно как переменная в win2k
    в досе  - было только скрытое состояние errorlevel, проверяемое командой if [not] errorlevel N, как такой командой пользоваться кажется уже разобрались.

    Всего записей: 2920 | Зарегистр. 25-04-2007 | Отправлено: 23:27 28-10-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vitaliy91
    Значит %errorlevel% не определена, но errorlevel ведь работает.

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 23:43 28-10-2010 | Исправлено: king_stiven, 23:54 28-10-2010
    vitaliy91

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

    Всего записей: 37 | Зарегистр. 16-11-2008 | Отправлено: 00:01 29-10-2010
    king_stiven

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

    Цитата:
    echo %errorlevel%
    if not errorlevel 0 echo err

    В данном случае errorlevel отслеживет предыдущие до echo код возврата так как команда ECHO никак не влияет на код возврата, поэтому конструкция
     
    if not errorlevel 0 echo err
     
    расшифровывается как: если код возврата меньше нуля, то вывести err,  
    но так как код возврата не может быть меньше 0 , то соотвественно err и не выводится. Вот я запустил в винде:

    Код:
    chcp 1251
    echo %vel%
    if errorlevel==0 echo код возврата равен 0, то есть команда echo %vel% никак не влияет на код возврата, несмотря на неопределённую переменную vel
    pause

     
     
     
    D:\temp>chcp 1251
    Текущая кодовая страница: 1251
     
    D:\temp>echo
    Режим вывода команд на экран (ECHO) включен.
     
    D:\temp>if errorlevel 0 echo код возврата равен 0, то есть команда echo  никак н
    е влияет на код возврата, несмотря на неопределённую переменную vel
    код возврата равен 0, то есть команда echo  никак не влияет на код возврата, нес
    мотря на неопределённую переменную vel
     
    D:\temp>pause
    Для продолжения нажмите любую клавишу . . .
     
    то есть получается что выражение
    if not errorlevel 5
     
    будет означать: если код возврата меньше пяти
     
    в отличие от  
    if errorlevel 5
      : если код возврата равен пяти
     
     

    Код:
    CD B:
    if errorlevel 1 echo err

    должно вывести err

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 09:15 29-10-2010 | Исправлено: king_stiven, 09:58 29-10-2010
    Accessor



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vitaliy91
    Цитата:
    CD B:
    Invalid drive specification
    if not errorlevel==0 echo err
    Ничего не выводится  
    А ничего и не должно выводиться. Читаем справочку по команде if :
    Код:
    C:\>if /?
    Оператор условного выполнения команд в пакетном файле.
     
    IF [NOT] ERRORLEVEL число команда
    IF [NOT] строка1==строка2 команда
    IF [NOT] EXIST имя_файла команда
    Следовательно errorlevel нельзя проверять на равенство. А можно только лишь применить к нему логическое отрицание NOT. А проверять errorlevel нужно ступенчато сверху вниз. Причём без знака процента. Т.е. должно быть примерно вот так:
    Код:
    rar.exe a b:\*.*
    if errorlevel 255 echo Операция была прервана пользователем.
    if errorlevel    9  echo Произошла ошибка при создании файла.
    if errorlevel    8  echo Недостаточно памяти для выполнения операции.
    if errorlevel    7  echo Допущена ошибка при указании команды/параметра
    if errorlevel    6  echo Произошла ошибка открытия файла.
    if errorlevel    5  echo Произошла ошибка записи на диск.
    if errorlevel    4  echo Предпринята попытка изменить заблокированный архив
    if errorlevel    3  echo Во время распаковки обнаружена ошибка CRC.
    if errorlevel    2  echo Произошла критическая ошибка.
    if errorlevel    1  echo Произошла некритическая ошибка.
    if errorlevel    0  echo Работа завершена без ошибок.

     
     
     
     
    wolf0425
    Цитата:
    ЕМНИП псевдопеременная %errorlevel% появилась именно как переменная в win2k  
    Если бы это была настоящая переменная, то она была бы видна в результате выполнения команды
    Код:
    c:\>set
    Но, увы, этого не происходит.

    Всего записей: 2861 | Зарегистр. 31-10-2003 | Отправлено: 12:02 29-10-2010 | Исправлено: Accessor, 12:05 29-10-2010
    vitaliy91

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо. Вроде разобрался
     
    И такой вопрос. Как можно найти первую свободную букву в чистом досе
    IF exist A: в чистом досе не работает
    CD A:   не оставляет кода возврата

    Всего записей: 37 | Зарегистр. 16-11-2008 | Отправлено: 14:52 29-10-2010
    Accessor



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vitaliy91
    ну, как же не оставляет? ты так ничего и не понял.
    вот смотри
    Код:
    cd b:
    if errorlevel 1 (echo error) else (echo no error)
    выводит error в то время как
    Код:
    cd с:
    if errorlevel 1 (echo error) else (echo no error)
    выводит no error

    Всего записей: 2861 | Зарегистр. 31-10-2003 | Отправлено: 14:59 29-10-2010
    vitaliy91

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В чистом досе CD не возвращает ошибки
    А у оператора условия нет else и не должно быть скобок.
    Приходиться мучаться
     

    Всего записей: 37 | Зарегистр. 16-11-2008 | Отправлено: 15:14 29-10-2010 | Исправлено: vitaliy91, 15:15 29-10-2010
    wolf0425



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

    Цитата:
    Если бы это была настоящая переменная, то она была бы видна в результате выполнения команды

    так в виндах - она и видна замечательно только не в команде set, а при использовании.
     
    Добавлено:

    Цитата:
    В чистом досе CD не возвращает ошибки  
    а вот это - засада...

    Всего записей: 2920 | Зарегистр. 25-04-2007 | Отправлено: 15:20 29-10-2010 | Исправлено: wolf0425, 15:21 29-10-2010
    Accessor



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Цитата:
    так в виндах - она и видна замечательно только не в команде set, а при использовании.  
    Наверное она создаётся в момент запуска пакетного файла. Будем знать.
     
    vitaliy91
    Ты совершенно неверно понимаешь ситуацию. Точнее заблуждаешься. Во-первых чистый ДОС - это операционка, в моём понимании, существовавшая до появления Windows 95. Из числа продуктов фирмы Microsoft мне известны версии 3.30, 5.0, 6.0 и 7.1; последняя - это базовая ОС для win95, win98 и Линолеум. С тех пор чистый ДОС перестал существовать, точнее развиваться. То, что ты представил на скриншоте - это не чистый ДОС. Это всего-навсего консольное окно, запушенное из-под графической оболочки твоей Висты или Семёрки.
    Теперь идём дальше. Чтоб иметь возможность обработать errorlevel нужно запускать команды не из командной строки, последовательно одна-за-одной, набирая их вручную, а создать текстовый файл, например, с помощью Блокнота, записать в него весь набор команд и сохранить с любым именем и с расширением *.cmd и после этого запустить полученный файл обычным двойным кликом. Появится консольное окно, выполнятся команды и консоль закроется. Чтоб увидеть результат работы, в последней строке можно поставить команду pause
    Вот тогда, и только тогда тебе будет доступен и errorlevel, и else в команде if, и скобки в этой же команде.

    Всего записей: 2861 | Зарегистр. 31-10-2003 | Отправлено: 15:46 29-10-2010
    vitaliy91

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Accessor
    Я все прекрастно понимаю
    Последняя версия MS-DOS 6.22 после которой идут PC-DOS 7.0, 7.1 из win95 и PC-DOS 8.0 из win98
    Версия на скриншоте это патченный PC-DOS 8.0 который может запускаться под win и работает он точно также как например с дискеты.
    errorlevel можно проверить и из командной строки для этого я использовал errorlvl.exe который устанавливает определенный код возврата
     
     

    Всего записей: 37 | Зарегистр. 16-11-2008 | Отправлено: 16:01 29-10-2010 | Исправлено: vitaliy91, 16:02 29-10-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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 9
    vu1tur (09-01-2011 11:53): лимит страниц, продолжение — http://forum.ru-board.com/topic.cgi?forum=62&topic=22143


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru