|
|
|
Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора*10.01.2013, 15:41. Показов 132295. Ответов 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-файлов
Как определить количество цветов в подгружаемом рисунке и наиболее частые цвета |
|
1748 / 353 / 41
Регистрация: 15.10.2012
Сообщений: 550
|
|
| 28.04.2016, 11:04 | |
|
1
|
|
|
|
||||||
| 18.01.2017, 21:57 [ТС] | ||||||
|
Зацикливание на циклических симлинках
Если нужно рекурсивно просканировать каталог, в котором есть циклические симлинки (это такие, что ссылаются на каталог выше от текущего), то dir /a-l /s в этом не поможет:
с ключем /s обходит все каталоги, попадаясь на удочку.
0
|
||||||
|
0 / 0 / 0
Регистрация: 18.10.2014
Сообщений: 3
|
||||||
| 05.02.2017, 18:42 | ||||||
|
Вдруг обнаружил...
Запускаю .cmd из какой-то папки, в .cmd записано:
С удивлением обнаруживаю, что эти переменные не сравниваются, начинаю смотреть: "%CD%\" = "d:\XXXXXX\" "%~dp0" = "D:\XXXXXX\" Т.е. буковки дисков в разных регистрах...вот уж не ожидал ![]() Добавлено через 1 минуту Что интересно, если перейти в другой каталог, а потом вернуться - буква большая становится. Добавлено через 16 минут Переходить пробовал в %TEMP%, с другими папками так не получается.
0
|
||||||
|
0 / 0 / 0
Регистрация: 18.10.2014
Сообщений: 3
|
|
| 05.02.2017, 20:50 | |
|
Dragokas,
Да, спасибо работает, но придется это зарубить на носу
0
|
|
|
Покинул форум
3701 / 1484 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
|
|
| 17.02.2017, 12:32 | |
|
Об определении битности системы
Бытует мнение, что переменная %PROCESSOR_ARCHITECTURE% указывает на архитектуру ЦП компьютера, а потому определяют в командных сценариях битность системы через проверку наличия определенных значений реестра, каталогов, наличие которых свойственно x64 системам, шаманства с WMI и т.д. Есть и более экзотичные способы, но речь не о них. Те, кто ковырялся хоть раз в таких скриптах от Microsoft как setenv.bat (WinSDK) и иже с ним, знают, что в них определение битности системы строится относительно переменной, озвученной в самом начале. Почему? С виду может показаться, что подобная тактика ошибочна, но ведь в Microsoft не с потолка взяли данный подход, и, если капнуть глубже, оказывается, что %PROCESSOR_ARCHITECTURE% задается на этапе установки системы значением поля wProcessorArchitecture структуры SYSTEM_INFO, указывающее в свою очередь на "архитектуру процессора установленной операционной системы" (the processor architecture of the installed operating system). Иначе говоря, если компьютер на базе процессора AMD64, а установленная система 32-битная, %PROCESSOR_ARCHITECTURE% будет иметь значение x86, если 64-битная - значением будет либо x64, либо AMD64, либо IA64.
0
|
|
|
741 / 339 / 134
Регистрация: 17.03.2014
Сообщений: 842
|
|||||||
| 19.02.2017, 14:29 | |||||||
0
|
|||||||
|
741 / 339 / 134
Регистрация: 17.03.2014
Сообщений: 842
|
||||||
| 19.02.2017, 19:05 | ||||||
|
на выход НЕ пойдёт лишний пробел (в обсуждаемом решении)
0
|
||||||
|
7 / 7 / 0
Регистрация: 08.05.2017
Сообщений: 55
|
||||||
| 19.05.2017, 11:56 | ||||||
0
|
||||||
|
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
|
|
| 19.05.2017, 14:17 | |
|
zb,
да здрасьте! запуск пустой строки echo( или echo. - привычнее потом запуск нового cmd с этой переданной пустой строкой вот и получается две пустые строки.
2
|
|
|
|
|||||||||
| 24.07.2017, 19:41 [ТС] | |||||||||
|
Баг модификатора ~s (преобразование имени файла в формат 8.3)
Создайте папку с именем "Темповая папка" Создайте в ней батник с именем "авп" Выполните код:
1
|
|||||||||
|
189 / 146 / 32
Регистрация: 04.10.2013
Сообщений: 150
|
|
| 25.07.2017, 18:58 | |
|
Причем для Windows10 - именно на диске С: и дело не букве))
0
|
|
|
189 / 146 / 32
Регистрация: 04.10.2013
Сообщений: 150
|
|||
| 25.07.2017, 19:31 | |||
|
Опишу простейший
создаем папку "Темповая папка" в корне диска D: и C: в нее исполняемый файл "авп.BAT" открываем консоль и запускаем батники:
1
|
|||
|
|
||||||||||||||||||
| 09.09.2017, 12:07 | ||||||||||||||||||
0
|
||||||||||||||||||
|
2 / 2 / 0
Регистрация: 05.09.2017
Сообщений: 4
|
||||||
| 20.09.2017, 12:29 | ||||||
|
Пролистал всю ветку, вроде подобного не нашел.
Столкнулся с некоторыми особенностями в именах переменных. Если первый символ имени переменной является цифрой, то возникает путаница. Интерпретатор строку вида %2var% раскрывает как параметр командной строки %2. при этом значение из такой переменной получить можно посредством set 2var , или !2var!
0
|
||||||
|
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
|
|||||||||||
| 20.09.2017, 17:24 | |||||||||||
|
SilverVox,
можно так получить значение
1
|
|||||||||||
| 20.09.2017, 17:24 | |
|
Ошибки при создании заметки Частые ошибки Частые ошибки winapi Частые ошибки в работе компьютера Частые системные ошибки windows 8 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|