Rumata пишет:Более того, комментарии-двоеточия количеством более одного внутри циклов не допустимы - выводится сообщение вида Системе не удается найти указанный диск..
Надо уточнить: не внутри циклов, а внутри составных команд, более не одного, а одного подряд.
Попробуем разобраться. Комментарии-двоеточия — строго говоря, испорченные метки.
В двух метках подряд смысла нет. Вне составных команд интерпретатор обрабатывает сценарий построчно и ничего не знает о соседних строках. Составные команды считываются целиком и можно предположить, что в строке идущей после метки или комментария-двоеточия интерпретатор не ожидает увидеть метку и в случае двух двоеточий подряд пытается истолковать команду как команду переключения рабочего диска «буква_диска:» (в связи с появлением ключа /D у команды CD многие успели позабыть о такой).
Если ограничиться одним двоеточием или разделить двоеточия между собой, например, пробелом, то в пакетных файлах ошибка исчезает, но в интерактивном режиме каждая вторая строка будет вызывать ошибку
Синтаксическая ошибка в имени файла, имени папки или метке тома.
или
":" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Но всё это ошибки не приводящие к немедленному завершению скрипта и даже текущей составной команды. А вот пустая строка или закрывающая скобка после метки или комментария-двоеточия в составной команде недопустимы.
Коль зашла речь о метках внутри составных команд, то ясно, что в связи с построчной обработкой командных файлов переход на такую метку разрушит составную команду. Что при этом произойдёт с закрывающими скобками?
Если перед скобкой есть ещё какие-то непробельные символы то возможны различные случаи:
— скобка становится аргументом предыдущей команды (его частью),
— скобка становится частью команды, в большинстве случаев — несинтаксическая ошибка (файл не найден),
— синтаксическая ошибка.
Но вот если перед скобкой нет ничего кроме пробельных символов, и последующие символы (если есть) отделены хотя бы одним пробельным (в обоих случаях к пробельным символам приравниваются запятая, точка с запятой и знак равенства), то ошибки не будет и строка не будет обрабатываться и отображаться при включенном ECHO ON —
вот ещё один способ создания комментариев (правда, только вне составных команд);
такой комментарий может быть продолжен на следующую строку с помощью «^».
На самом деле, так же как и с помощью двоеточия, комментарии с помощью закрывающей скобки возможны не с начала строки, если перед скобкой добавить «&» :
но такая ситуация не должна встретиться при переходе на метку внутри составной команды.
А возможны ли комментарии не до конца строки (например, для отключение части строки при отладке без переформатирования строк или для каких-то ухищрений при смешении в одном файле различных форматов)?
Да, причём при помощи штатной команды REM!
Если после REM без пробела поставить один из знаков
(по тем же соображениям, что и для ECHO «.» и «\» нежелательны,
после «/» не должны следовать
«?» + пробельные символы + дополнительные аргументы),
то следующие за ней спецсимволы будут обрабатываться как в обычной команде:
rem: многострочный^
комментарий >empty.txt & cls
(rem:comment) & dir
— пустой файл будет создан, команды «cls» и «dir» — выполнены.
Исключением является символ перенаправления в конвейер «|» — как слева, так и справа от него такая команда REM вызывает ошибку вида
"rem:" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
_______________________________________
Rumata пишет:Очень интересный способ конвертации целых чисел в шестнадцатеричное представление
cmd /c exit /b 3735928559
echo %=ExitCode%
Если код возврата принадлежит отрезку 32...126, то также определена переменная %=ExitCodeAscii%, содержащая символ с указанным кодом. Открыто не мной, можно найти в разных источниках и сообщается здесь лишь для полноты изложения, т.к. ограничение на принимаемые значения делает эту переменную малополезной.
%=ExitCode%, %=ExitCodeAscii% — настоящие переменные окружения в отличии, например, от %RANDOM%, их можно увидеть с помощью команды