Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/642: Рейтинг темы: голосов - 642, средняя оценка - 4.64
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора*

10.01.2013, 15:41. Показов 133586. Ответов 116

Студворк — интернет-сервис помощи студентам
Эта тема - ответвление Тонкости языка, редкие команды и сложные скрипты

Постим сюда детали, которые Вы получили опытным путем.
Которые считаете уникальными, или могут быть полезными при наборе кода 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2013, 15:41
Ответы с готовыми решениями:

Ошибки при запуске bat-файлов
У меня проблема, что при запуске cmd.exe, что при запуске любого *.bat-файла, появляется такое же сообщение "c:/programПрограмма не...

Наиболее частые значения в таблицах Lua
Ребят, подскажите пожалуйста, не как не могу сообразить, как получить из таблицы наиболее повторяющееся число? например: T1 =...

Как определить количество цветов в подгружаемом рисунке и наиболее частые цвета
Заранее благодарен...

116
 Аватар для YupiRex
189 / 146 / 32
Регистрация: 04.10.2013
Сообщений: 150
04.10.2013, 19:44
Студворк — интернет-сервис помощи студентам
ping 127.0.0.1 > ping.txt - записывает результат выполнения команды в файл, a
start ping 127.0.0.1 > ping.txt - создает пустой файл
как это исправить?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.10.2013, 19:48  [ТС]
Bash
1
start "" cmd /c "ping 127.1 > desktop\ping.txt"
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
05.01.2014, 00:07  [ТС]
@= в синтаксическом разборе FOR - бага CMD ?

Сравните вывод от команд:
Bash
1
2
3
4
5
6
7
8
9
10
@echo off& SetLocal
echo @=my text
For /F "UseBackQ delims=" %%a in ('@=my text') do @echo %%a
For /F "delims=" %%a in ('echo @=my text') do @echo %%a
set name=@=my text
echo %name%
For /F "UseBackQ delims=" %%a in ('%name%') do @echo %%a
For /F "delims=" %%a in ('echo %name%') do @echo %%a
For /F "delims=" %%a in ("%name%") do @echo %%a
pause
_________
ADD. Попробовал через DelayedExpansion - работает... хм

Bash
1
2
3
4
@echo off& SetLocal EnableDelayedExpansion
echo @=my text
For /F "UseBackQ delims=" %%a in ('!name!') do @echo %%a
pause
Миниатюры
Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора*  
1
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
05.01.2014, 16:47
Dragokas, добавлю еще к размышлению:
Bash
1
for /f "usebackq tokens=1* delims=;" %%A IN ('%PATH%') DO echo.%%~A
Здесь, правда, проблема в том, что cmd видит ";" как пробел (где-то я это читал)
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
05.01.2014, 19:16  [ТС]
FraidZZ, поменял на кавычки. И у меня все нормально. А что должно было произойти?
Если ты про облом в синтаксисе, так тут объяснение простое - скобки (они в выводе Path) и их нельзя писать внутрь обработки FOR, как строка. Нужно экранировать исключительно двойными кавычками или раскрывать через !
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
13.06.2014, 13:00  [ТС]
Особенности работы "собаки".
2
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
13.06.2014, 13:10  [ТС]
Ограничение математики для оператора IF при сравнении чисел.

Вот, что нашел:

Когда разница между операндами превышает [ Максимум типа INT32 + 1 ] (2147483647 + 1),
операция LSS всегда возвращает "ЛОЖЬ",
операция LEQ всегда возвращает "ЛОЖЬ",
операция GTR всегда возвращает "ИСТИНА",
операция GEQ всегда возвращает "ИСТИНА".

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
SetLocal EnableExtensions
 
set MAX=2147483640
 
For %%o in (LSS LEQ GTR GEQ) do (
  For /L %%n in (-9 1 -6) do (
    set /p =%%n %%o %MAX% ? <NUL
    call :# %%n %%o %MAX% & rem 'IF' statement don't support delayed method for operator
  )
  echo -------------------------
)
pause & exit /B
 
:# [_in_operand1] [_in_operator] [_in_operand2]
if %~1 %~2 %~3 (echo true  +) else (echo FALSE -)
Результаты:

-9 LSS 2147483640 ? FALSE -
-8 LSS 2147483640 ? true +
-7 LSS 2147483640 ? true +
-6 LSS 2147483640 ? true +
-------------------------
-9 LEQ 2147483640 ? FALSE -
-8 LEQ 2147483640 ? true +
-7 LEQ 2147483640 ? true +
-6 LEQ 2147483640 ? true +
-------------------------
-9 GTR 2147483640 ? true +
-8 GTR 2147483640 ? FALSE -
-7 GTR 2147483640 ? FALSE -
-6 GTR 2147483640 ? FALSE -
-------------------------
-9 GEQ 2147483640 ? true +
-8 GEQ 2147483640 ? FALSE -
-7 GEQ 2147483640 ? FALSE -
-6 GEQ 2147483640 ? FALSE -
EQU и NEQ работают нормально.
5
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
24.06.2014, 14:49  [ТС]
"Падение" батника при запуске правой кнопкой мыши "от имени администратора"

Недавно участник форума 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" %*"

Либо воспользоваться таким фиксом:
Code
1
2
3
4
5
6
7
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
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
24.07.2014, 22:45  [ТС]
Использование Choice и регистр символов

Регистр символов игнорируется только для букв английского алфавита.

Т.е.
choice /C YN
варианты ввода могут быть как YN, так и yn

Для
choice /C ДН
ввести можно только Д или Н, но не д, н.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
28.07.2014, 00:11  [ТС]
Лишние пробелы в конце Set.

Не попадитесь на пробелы в конце переменной.
Пробелы перед каналом - это продолжение имени переменной.
Миниатюры
Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора*  
2
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
09.08.2014, 16:50  [ТС]
Лишние пробелы после знака перенаправления могут оказаться головной болью

Пример:

Bash
1
echo -->>"%Q4%"
Здесь после последней кавычки стоит 4 пробела.
Все они будут записаны в файл %Q4%
2
1783 / 765 / 130
Регистрация: 09.04.2011
Сообщений: 1,330
11.08.2014, 12:07
Цитата Сообщение от Dragokas Посмотреть сообщение
Лишние пробелы после знака перенаправления могут оказаться головной болью
Dragokas, поэкспериментировал на WinXP, проблем не обнаружил.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
::@echo off
echo -->out.txt
echo -->> out.txt
echo -->>  out.txt
echo -->>   out.txt
echo -->>"out.txt"
echo -->> "out.txt"
echo -->>   "out.txt"
echo -->>"out.txt "
echo -->>"out.txt  "
echo -->>"out.txt   "
::pause
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.08.2014, 13:09  [ТС]
sov44, и не удивительно.
В какой из строк у тебя пробелы стоят после последней кавычки?
1
1783 / 765 / 130
Регистрация: 09.04.2011
Сообщений: 1,330
11.08.2014, 13:30
Ну да, поставил пробелы после кавычек, они появились в текстовом файле. Прикольно!

Не по теме:

сорри, не правильно понял пост

0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.09.2014, 23:27  [ТС]
Здесь должна была быть Ваша реклама инструкция по воспроизведению бага for /r.
1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
22.09.2014, 19:44
Цитата Сообщение от Dragokas Посмотреть сообщение
Лишние пробелы после знака перенаправления могут оказаться головной болью
Не только. Я угробил полтора часа на отладку этого батника. В хвосте стр.7 первоначально был лишний пробел - дошло только после слияния с goto.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
06.10.2014, 11:59  [ТС]
Не совсем баг, можно сказать - особенность:

Создайте файл "echo" (без расширения) и рядом батник:
Bash
1
2
@echo.
@pause
Получим:
"echo." не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
2
887 / 189 / 16
Регистрация: 18.07.2011
Сообщений: 260
13.10.2014, 21:25
Bash
1
echo 1^
Удивительно, но если знак крышки последний символ батнике, то батник зависает.
2
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
13.10.2014, 21:50  [ТС]
При чем отъедает весь процессор.
И при разных запусках нужно разное кол-во нажатий Ctrl+C, чтобы его закрыть.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.03.2015, 20:22  [ТС]
Интересное наблюдение:

если поставить 2 пробела в качестве разделителя, то пробел перестает рассматриваться как разделитель:
Bash
1
2
J:\>@for /F "delims=,  " %f in ("test 2") do @echo %f
test 2
Постает вопрос, чем тогда этот разделитель становится?
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.03.2015, 20:22

Ошибки при создании заметки
Пару дней назад установил Друпал на Xampp, частенько на разных страницах пришет не большие &quot;user warning&quot; но при этом не...

Частые ошибки
Есть проблема и уверен что системная, а не программная. Проблема в том что во время установки программ, они устанавливаются не правильно,...

Частые ошибки winapi
Подскажите, что я делаю не так. Программа запускается без ошибок, но кнопку, которую я создаю, не видно, не видно иконку и изображение,...

Частые ошибки в работе компьютера
Доброго времени суток. Перейду сразу к делу: После включения компьютера никакая программа не работает более 5-10 минут. Сразу закрывается...

Частые системные ошибки windows 8
Что то уж слишком часто начали появляться системные ошибки, почти все разные, ноут HP ENVY M6, ему всего 2 месяца. Подскажите в чем может...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru