1 | |
Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора*10.01.2013, 15:41. Показов 119595. Ответов 116
Метки %~dp0, chcp 1251, кодировка в консоли, оптимизация кода, режим вывода команд на экран (echo) включен, текущий рабочий каталог bat, украинский cmd/bat, экранирование спецсимвола (Все метки)
Эта тема - ответвление Тонкости языка, редкие команды и сложные скрипты
Постим сюда детали, которые Вы получили опытным путем. Которые считаете уникальными, или могут быть полезными при наборе кода BAT файлов, лучшего понимания принципов работы среды командной строки. Пишем ошибки, которые иногда допускаете, а потом ломаете голову, почему не работает Писать можно много и часто, даже если это мелочь. Все соберем вместе. Весомые замечания перенесем в указанную выше тему. Собрано по категориям: Файловые операции 5) Использование рабочего каталога Bat файла в роле начального для выполнения команд в нем на ОС >= Vista ссылка 8) Как проверить - существует ли папка ссылка 10) Не использовать && после команды Del. ссылка 12) После перехода в другой каталог проверять успех операции ссылка 18) Листинг текущего каталога или корневого ссылка 24) Работа с файлами/папками, в именах которых есть буквы украинского алфавита. ссылка Символы 1) Экранирование спецсимвола ссылка 13) Сохранение концевого пробела в переменную ссылка 17) Запятая и точка с запятой - разделители аргументов ссылка 30) Экранирование номера потока в перенаправлении вывода Echo ссылка Переменные 2) Использование одноименных переменных без обнуления ссылка 3) Пренебрежение Setlocal ссылка 3.1) Не указав Setlocal EnableDelayedExpansion, используем знаки восклицания (!) для раскрытия значения переменных ссылка 6) Инициализация числового типа данных ссылка 14) Обход ошибки "Режим вывода команд на экран (ECHO) включен" ссылка 16) Пробелы тоже могут являться частью названия переменной ссылка 23) Для команды SET всегда заключайте в кавычки переменную и значение, если ним является изменяемое имя файла ссылка 28) Двойное раскрытие переменной. Первыми раскрываются проценты. ссылка 29) Конструкция вида Echo.!Var:~0,1! не работает. ссылка Циклы 7) EOL в цикле FOR - правильный порядок модификаторов ссылка 9) Использовать UseBackQ при чтении содержимого файла, имя которого может меняться ссылка 25) Получение даты и времени файла через цикл и команду For без ключа /S (рекурсия) и подпрограммы ссылка Кодировка 4) Сохранение BAT-файла с кодировкой перевода строк в UNIX-стандарте ссылка 26) Кодировка в консоли ссылка 27) Текстовой файл не читается циклом по неизвестной причине ссылка Тесты, оптимизация и граничные возможности интерпретатора 15) Граничные значения для числового типа в CMD ссылка 19) Максимальная глубина рекурсии = 593*. ссылка 20) Максимальная длина значения строки ссылка 21) Оптимизация кода ссылка 22) Тест замедления работы операторов при перегрузке оперативной памяти ссылка Другое 1) Указывая метку подпрограммы, можно через пробел указывать ее описание. Среда не будет "ругаться" ссылка 11) Внимательно выбирайте имя для BAT(CMD)-файла ссылка
0
|
10.01.2013, 15:41 | |
Ответы с готовыми решениями:
116
Ошибки при запуске bat-файлов Наиболее частые значения в таблицах Lua Как определить количество цветов в подгружаемом рисунке и наиболее частые цвета Ошибки при создании заметки |
188 / 145 / 32
Регистрация: 04.10.2013
Сообщений: 149
|
|
04.10.2013, 19:44 | 41 |
ping 127.0.0.1 > ping.txt - записывает результат выполнения команды в файл, a
start ping 127.0.0.1 > ping.txt - создает пустой файл как это исправить?
0
|
05.01.2014, 00:07 [ТС] | 43 | ||||||||||
@= в синтаксическом разборе FOR - бага CMD ?
Сравните вывод от команд:
ADD. Попробовал через DelayedExpansion - работает... хм
1
|
Модератор
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
|
||||||
05.01.2014, 16:47 | 44 | |||||
Dragokas, добавлю еще к размышлению:
0
|
05.01.2014, 19:16 [ТС] | 45 |
FraidZZ, поменял на кавычки. И у меня все нормально. А что должно было произойти?
Если ты про облом в синтаксисе, так тут объяснение простое - скобки (они в выводе Path) и их нельзя писать внутрь обработки FOR, как строка. Нужно экранировать исключительно двойными кавычками или раскрывать через !
1
|
13.06.2014, 13:00 [ТС] | 46 |
2
|
13.06.2014, 13:10 [ТС] | 47 | |||||
Ограничение математики для оператора IF при сравнении чисел.
Вот, что нашел: Когда разница между операндами превышает [ Максимум типа INT32 + 1 ] (2147483647 + 1), операция LSS всегда возвращает "ЛОЖЬ", операция LEQ всегда возвращает "ЛОЖЬ", операция GTR всегда возвращает "ИСТИНА", операция GEQ всегда возвращает "ИСТИНА".
5
|
24.06.2014, 14:49 [ТС] | 48 |
"Падение" батника при запуске правой кнопкой мыши "от имени администратора"
Недавно участник форума vavun обратил мое внимание, что запуск одного из наших полезных скриптов "от имени администратора" не запускает батник. Проводя расследование, сразу бросился в глаза спецсимвол & в пути к батнику: c:\users\alex\downloads\Поиск с Поиск в Google & Yandex\Установить пункт контекстного меню.cmd Убираем его - все запускается нормально. Перехватчик консольных окон (с выставленным интервалом поиска в 1 мс.) однозначно показал, что путь передается неверно: а Sysinternals ProcMon показывает вот такую интересную картину: Почему же обычный запуск работает нормально? Рассмотрим последовательность запуска. Обычный запуск: ОС берет команду для ассоциации из реестра по пути: HKCR\cmdfile\shell\open\command и исполняет. Запуск с повышенными привилегиями: Здесь в игру вступает consent.exe, которая запрашивает разрешение (диалоговое окно согласно настроек User Account Control (UAC). Проверяет сертификаты, права доступа... Затем запускает дочерний процесс, указанный в команде для ассоциации из реестра: HKCR\cmdfile\shell\runas\command Обратите внимание на различия: Как видим, в режиме повышенных привилегий, вызов батника осуществляется с явным указанием приложения-обработчика cmd.exe Видимо того требует consent.exe, иначе ей не будет понятно, какое приложение вызывать. Проблема в том, что дяди из M$ в спешке прописали часто используемый ими повсеместно в реестре "шаблон" %1 %* думая, что здесь все тоже самое "пройдет", но в cmd очень особый парсер аргументов. Читать свою же справку им лень: А всего то нужно добавить кавычки к ассоциации. Вот так: %SystemRoot%\System32\cmd.exe /C ""%1" %*" Либо воспользоваться таким фиксом: Код
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\cmdfile\shell\runas\command] @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\ 00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6d,00,\ 64,00,2e,00,65,00,78,00,65,00,20,00,2f,00,43,00,20,00,22,00,22,00,25,00,31,\ 00,22,00,20,00,25,00,2a,00,22,00,00,00 через контекстное меню "от имени администратора" больше не будет приводить к "падению". И конечно все тоже самое нужно выполнить с подразделом HKEY_CLASSES_ROOT\batfile\shell\runas\command
6
|
24.07.2014, 22:45 [ТС] | 49 |
Использование Choice и регистр символов
Регистр символов игнорируется только для букв английского алфавита. Т.е. choice /C YN варианты ввода могут быть как YN, так и yn Для choice /C ДН ввести можно только Д или Н, но не д, н.
1
|
09.08.2014, 16:50 [ТС] | 51 | |||||
Лишние пробелы после знака перенаправления могут оказаться головной болью
Пример:
Все они будут записаны в файл %Q4%
2
|
1779 / 761 / 130
Регистрация: 09.04.2011
Сообщений: 1,325
|
||||||
11.08.2014, 12:07 | 52 | |||||
Dragokas, поэкспериментировал на WinXP, проблем не обнаружил.
0
|
1779 / 761 / 130
Регистрация: 09.04.2011
Сообщений: 1,325
|
|
11.08.2014, 13:30 | 54 |
Ну да, поставил пробелы после кавычек, они появились в текстовом файле. Прикольно!
Не по теме: сорри, не правильно понял пост
0
|
19.09.2014, 23:27 [ТС] | 55 |
Здесь должна была быть Ваша
1
|
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|
22.09.2014, 19:44 | 56 |
Не только. Я угробил полтора часа на отладку этого батника. В хвосте стр.7 первоначально был лишний пробел - дошло только после слияния с goto.
0
|
887 / 189 / 16
Регистрация: 18.07.2011
Сообщений: 260
|
||||||
13.10.2014, 21:25 | 58 | |||||
2
|
12.03.2015, 20:22 [ТС] | 60 | |||||
Интересное наблюдение:
если поставить 2 пробела в качестве разделителя, то пробел перестает рассматриваться как разделитель:
2
|
12.03.2015, 20:22 | |
12.03.2015, 20:22 | |
Помогаю со студенческими работами здесь
60
Частые ошибки Частые ошибки winapi Частые ошибки в работе компьютера Частые системные ошибки windows 8 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |