У меня очень длинная строка командной строки, и я хочу прокомментировать некоторые аргументы/переключатели и описать, что они делают и что с их помощью можно настроить. следующий упрощенный пакетный файл не работает, но это более или менее то, что я хочу сделать:
executable^
-switch1=3^ rem should be 3 or 5, three means xxx and 5 means yyy
-argument1=some-file.txt^
-file-format=csv^ rem output file format, supported are csv and xml
-out=result rem written file, file extension is copied from file format
Я создал простой скрипт для проверки синтаксиса объединения комментариев с командной строкой разделения, но не смог найти рабочего решения:
rem WORKS, no space after caret
echo aaa ^
bbb
rem does not work, space after caret
echo aaa ^
bbb
rem WORKS space in the next line
echo aaa ^
bbb
echo(
echo and now with rem-comments
echo(
rem does not work
echo aaa ^rem comment
bbb
rem does not work
echo aaa ^&rem comment
bbb
rem does not work
echo aaa ^ rem comment
bbb
rem does not work
echo aaa ^ &rem comment
bbb
echo(
echo and with double-colon-comments
echo(
:: does not work
echo aaa ^:: comment
bbb
:: does not work
echo aaa ^&:: comment
bbb
:: does not work
echo aaa ^ :: comment
bbb
:: does not work
echo aaa ^ &:: comment
bbb
Кажется, что любой символ после курсора нарушает его, поэтому может быть вообще невозможно иметь встроенный комментарий после курсора? Есть ли у кого-нибудь идея/решение?
Подсказка не по теме: Прочтите тему на форуме DosTips: ЭХО. НЕВОЗМОЖНО ввести текст или пустую строку. Вместо этого используйте ECHO/ Использование echo. всегда приводит к доступу к файловой системе для поиска файла с именем echo в текущем каталоге. Точка в конце автоматически удаляется функциями файлового ввода-вывода Windows. Лучше использовать echo/ или echo( для вывода пустой строки, что в данном случае делается без доступа к файловой системе, что делает командный файл более отказоустойчивым и обрабатывается немного быстрее.
Это полезно знать, спасибо за подсказку!





Невозможно иметь такие команды, как rem, внутри команды, распределенной по нескольким строкам. Символ каретки ^ в качестве escape-символа в конце строки работает только при наличии следующего возврата каретки (игнорируется при автоматическом чтении пакетного файла) и перевода строки. Даже конечный пробел, такой как обычный пробел или горизонтальная табуляция, приведет к разделению длинной командной строки на две командные строки, и выполнение исполняемого файла не будет работать должным образом. Командный процессор Windows использует очень старый синтаксис, который не поддерживает пробелы и табуляцию, как современные интерпретаторы сценариев. Дополнительную информацию об обработке командной строки или пакетного файла см. в разделе Как интерпретатор команд Windows (CMD.EXE) анализирует сценарии?
Решение очень простое. Длинная командная строка записывается в пакетном файле как одна длинная командная строка, и все параметры объясняются в блоке выше, который более или менее игнорируется при выполнении с использованием команды goto, как показано ниже.
goto RunExe
rem -switch1=3 ......... should be 3 or 5, three means xxx and 5 means yyy
rem -file-format=csv ... output file format, supported are csv and xml
rem -out=result ........ written file, file extension is copied from file format
:RunExe
executable -switch1=3 -argument1=some-file.txt -file-format=csv
отличная читабельность (👍👍👍), близкая к типичным справочным/справочным страницам. я вижу только один очень маленький недостаток: у вас есть все переключатели и аргументы дважды, вам нужно синхронизировать комментарий при настройке/настройке реальной командной строки... но, конечно, это человеческая проблема 😁
Вы можете использовать процентные комментарии.
Они полностью исчезают с линии, поэтому не мешают.
echo aaa ^%= My first comment here =%
bbb^%= Second comment =%
ccc%= My last comment =%
Это работает, потому что парсер пытается расширить комментарий как переменную, но если он не может найти такую переменную, он расширяется до пустой строки.
Поэтому начинать следует с %=, потому что переменные не могут быть созданы с начальным знаком равенства.
Важно не включать в комментарии двоеточия, поскольку они рассматриваются как специальные операторы модификации переменных и полностью нарушают комментарий.
Процентный комментарий можно использовать практически в любой позиции строки.
echo aaa ^%= My comment here =%
bbb%= This comment is in front of the caret=%^
c%=This comment is inside the text =%cc
Это очень интересное решение 👍 Все еще не уверен, собираюсь ли я (или должен) использовать его по двум причинам: а) подсветка синтаксиса в npp игнорирует его (потому что это не комментарий, а намеренно неправильное объявление переменной) б) если кто-то другой в моей компании не знают, что двоеточия в этой записи запрещены, это может вызвать проблемы. И, конечно, я не знаю, помню ли я, что двоеточия запрещены, когда мне придется изменить командный файл в будущем 😂
@Майкл Ты прав. Но я вообще советую не использовать пакетные файлы в продакшене (хотя по тегу пакетных файлов я занимаю второе место среди лучших пользователей). Усилия по написанию стабильных и безошибочных пакетных файлов просто слишком велики.
Я бы не назвал это производством напрямую (не доставкой клиентам), мы используем пакетные файлы для внутренних вещей, таких как средства запуска для клиент-серверных Java-приложений, openssl и ffmpeg. эти пакетные файлы уже существуют, но неинтересно копаться в openssl или ffmpeg, если вы какое-то время не трогали эти файлы. вот почему я ищу что-то, чтобы документировать переключатели/аргументы в пакетном файле как можно ближе к фактическому аргументу...
Я отмечу ваш ответ как принятый, поскольку он соответствует тому, о чем я просил, но я воспользуюсь предложением Мофи для документации, так как считаю, что его легче читать.
Ваша первоначальная концепция неверна, потому что символ конца строки ^ должен быть помещен в конец строки...
Я предлагаю другой подход, в котором нет проблем с двоеточиями в комментариях:
@echo off
setlocal EnableDelayedExpansion
set ^"\n=^
%don't remove%
^"
set "command = "
for /F "delims=/" %%a in (^"
executable !\n!
-switch1^=3 // should be: 3 or 5, three means xxx and 5 means yyy !\n!
-argument1^=some-file.txt !\n!
-file-format^=csv // output file format, supported are: csv and xml !\n!
-out^=result // written file, file extension is copied from file format
^") do set "command=!command! %%a"
%command%
В этом методе сначала создается переменная «конец строки» \n и помещается в конец каждой строки, содержащей команду. Каждая строка обрабатывается командой for /F и используется для сборки окончательной команды. «Часть комментария» отделяется косой чертой, которая включена в часть delims=/ команды FOR /F. Вы также можете использовать заглавную букву «R» в качестве разделителя комментариев и разделять комментарии с помощью команды REM.
Выполненная команда такова:
executable -switch1=3 -argument1=some-file.txt -file-format=csv -out=result
Единственным недостатком этого метода является то, что знаки равенства необходимо ^= экранировать, поскольку синтаксический анализатор их удаляет.
Нет, каретка — это escape-символ, который, по сути, экранирует следующий перевод строки (очень сжатое описание). Все, что после него, разрушает этот эффект. То, что пробел (и/или некоторые другие символы) работает, связано с тем, как парсер распознает и «переводит» строку.