|
|
|
Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора*10.01.2013, 15:41. Показов 133219. Ответов 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-файлов
Как определить количество цветов в подгружаемом рисунке и наиболее частые цвета |
|
|
|
| 04.02.2013, 00:55 [ТС] | |
|
Заметки
26) Кодировка в консоли По-умолчанию, текстовые файлы в Windows создаются в Win-кодировке (кодовая страница 1251). При этом сама консоль работает в кодировке DOS (CP-866). Когда в консоль попадает такой текст, он отображается некорректно. 1) Команда: Bash chcp 1251>nul а не т.н. "крякозябры". ![]() >nul - чтобы не выводилось сообщение от самой команды. 2) Альтернативой является сохранение самого текста (текстового файла) уже в кодировке, с которой по-умолчанию работает консоль (CP-866). Но такого функционала у встроенного блокнота Windows нет. И нужно использовать другие текстовые редакторы: Русский текст в консоли Недостатком 1-го способа является то, что сообщения от всех системных команд написаны в кодировке CP-866. И если воспользоваться командой chcp 1251, мы получим "крякозябры" уже от встроенных команд. Английский язык отображается одинаково в обеих кодировках.
2
|
|
|
95 / 95 / 4
Регистрация: 25.06.2012
Сообщений: 278
|
|
| 11.03.2013, 02:47 | |
|
0
|
|
|
|
||
| 11.03.2013, 03:01 [ТС] | ||
|
Это я уже сократил - было %* как в этом примере Список всех файлов в каталогах, пути к которым указаны в параметрах
строка № 5.
0
|
||
|
|
||||||
| 19.03.2013, 02:27 [ТС] | ||||||
|
28) Двойное раскрытие переменной. Первыми раскрываются проценты.
И такое иногда забывается: Правильно: Bash echo !param.%n%! Bash echo %param.!n!%
0
|
||||||
|
|
||||||||||||||||
| 22.03.2013, 03:12 [ТС] | ||||||||||||||||
|
29) Конструкция вида Echo.!Var:~0,1! не работает.
Баг (наверное) Демонстрация ошибки:
1
|
||||||||||||||||
|
|
|
| 10.05.2013, 02:03 [ТС] | |
|
Баги:
И все таки баг такой? Записать список всех файлов из каталога К, имена которых заканчиваются на цифру, в файл F Добавлено через 1 минуту Надо найти время сосчитать, сколько там скобок внутри файла для FindStr критично: Меню с запуском программ
0
|
|
|
887 / 189 / 16
Регистрация: 18.07.2011
Сообщений: 260
|
|||||||
| 13.05.2013, 21:34 | |||||||
|
Достаточно было выполнить
1
|
|||||||
|
|
||||||
| 25.06.2013, 22:10 [ТС] | ||||||
|
Перенаправление вывода цикла в файл без дозаписи
Недавно видел у FraidZZ. Очень полезная штука, когда хочешь сделать запись в файл всего накопленного буфера сразу. Причем, если файл уже существует, он будет стерт.
4
|
||||||
|
|
||||||
| 26.06.2013, 08:58 [ТС] | ||||||
|
В ходе неудачного эксперимента по превращению конвеерного потока в файловый:
Получил - не знаю зачем это может понадобится: Диагностический режим цикла, при котором все изменения внутри него не сохраняются: переменным на самом деле не присваиваются значения, но каждая итерация цикла выводится на экран.
1
|
||||||
|
|
|
| 02.07.2013, 08:03 [ТС] | |
|
Различия Start.exe и Start: BAT-файл для открытия ссылки в браузере
0
|
|
|
|
|||||||||||
| 14.07.2013, 21:10 [ТС] | |||||||||||
|
Скобки в математических операциях
Скобки в качестве приоритета для математических операций могут быть указаны просто так:
4
|
|||||||||||
|
|
|
| 16.07.2013, 01:40 [ТС] | |
|
Заключайте под дополнительные общие кавычки команду, выполняемую циклом, если она состоит из более чем 1 парной кавычки.
Иначе можем получить такие сообщения:
Пример: Bash for /f %%a in ('"%~dp0fsum.exe" -md5 -d"%windir%\system32" "notepad.exe"') do echo Cheksum: -----%%a------ Добавляем внешние парные кавычки: for /f %%a in ('""%~dp0fsum.exe" -md5 -d"%windir%\system32" "notepad.exe""') do echo Cheksum: -----%%a------ Это согласуется с правилами, описанными в синтаксисе CMD /?, так как команда цикла выполняется именно под CMD /C (в этом можно убедится открыв список процессов, и наблюдая еще +1 CMD.exe при входе в цикл).
7
|
|
|
|
|||||||
| 17.07.2013, 17:20 [ТС] | |||||||
|
Кодовые страницы, поддерживаемые CMD.
Интересная инфа из поста за авторством Ris
Кликните здесь для просмотра всего текста
2
|
|||||||
|
|
||||||||||||||||
| 24.07.2013, 02:46 [ТС] | ||||||||||||||||
|
К заметке о предельных возможностях командной строки:
Условия теста1: передача 1-го длинного аргумента из языка VBScript, используя объект WScript.Shell и метод Exec. Возврат обратно. Сравнение длинны переданной и полученной строки. Условия теста2: передача множества аргументов длинной в 1 символ... Результаты теста1: Максимальная длина аргумента = 8150. Результаты теста2: Макс. кол-во аргументов = 4075 4075 * 2 = 8150 (4075 аргументов + 4075 пробелов между ними). Возможная погрешность теста: Узкими местами могут быть: 1) ограниченность метода Exec. 2) ограниченность команды Echo. 3) ограничения, накладываемые на интерпретатор CMD ... Код эксперимента
MaxArgTest.cmd
SendArgMaxCount.vbs
1
|
||||||||||||||||
|
|
|
| 11.08.2013, 02:08 [ТС] | |
|
Когда нужны дополнительные @echo off и знаки @
Экранирование номера потока в перенаправлении вывода ECHO Также, если мы вручную запускаем консоль, иногда весьма удобно пользоваться @echo off, когда текущий каталог имеет очень длинное имя: Теперь вариант, когда мы не пишем @echo off, но используем @. Оцените компактность 2-го варианта:
1
|
|
|
|
|
| 11.08.2013, 21:35 [ТС] | |
|
Это проблемы с кодировкой в Вашей системе. Похоже повреждены записи в реестре.
Вот сделал скрипт восстановления кодировок. Заменяются реестровые записи: HKCU\Control Panel\International HKLM\SYSTEM\CurrentControlSet\Control\Nl s\CodePage и файлы *.NLS в Windows\System32 Резервное копирование Ваших исходных веток реестров и файлов включено в скрипт. Можно не бояться. (совместимость - Windows 7 x32 и x64). Возможно Windows Vista (надо проверить). В конце - перезагрузите систему. UPD. Забыл, что у NLS-файлов особые права. Прикручу эту фишку - Восстановление шрифтов после сбоя, и добавлю команду восстановления прав по таблице ACL. Тогда выложу скрипт целиком. Готово: https://www.cyberforum.ru/post3690119.html ________________________________________ ________________________________ Upd. 07.07.2014 На самом деле это из-за поврежденного или отсутствующего файла справки к cscript.exe Он должен называться cscript.exe.mui и находится, например для русской локализации системы, здесь: %SystemRoot%\System32\ru-RU\
2
|
|
|
|
||||||
| 04.10.2013, 02:00 [ТС] | ||||||
|
Исправление проблемы, когда не работает вывод коротких имен файлов Dir /X
Источник: techguy.org Режим представления коротких имен файлов может быть отключен. Проверить это можно, введя команду: Bash fsutil behavior query disable8dot3 Чтобы снова включить этот режим, введите: 1) для XP: Bash fsutil behavior set disable8dot3 0 2) для Vista и выше: Bash fsutil behavior set disable8dot3 2 Напомню, что данный режим отображает альтернативные имена в формате 8.3 и будет удобен, когда требуется работать с именами файлов и папок, имеющих:
Для автоматической подстановки и парсинга имен в формате 8.3. можно воспользоваться такой циклической конструкцией: Bash for /f "skip=5 tokens=4" %%? in ('dir /X /-C /A-D "c:\users\alex\desktop\*"') do echo %%? Для их фильтрации придется усложнить математику:
2
|
||||||
| 04.10.2013, 02:00 | |
|
Ошибки при создании заметки Частые ошибки Частые ошибки winapi Частые ошибки в работе компьютера Частые системные ошибки windows 8 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|