Как я могу разделить длинные команды на несколько строк в пакетном файле?
Разделите длинные команды на несколько строк с помощью командного файла Windows
Ответы (7)
Вы можете разбить длинные строки с помощью символа вставки ^, если помните, что символ вставки и новая строка, следующие за ним, полностью удалены. Итак, если должен быть пробел, где вы разрываете линию, добавьте пробел. (Подробнее об этом ниже.)
Пример:
copy file1.txt file2.txt
будет записано как:
copy file1.txt^
file2.txt
^ и после текста команды.
- person Joseph Daigle; 16.09.2008
echoed.
- person James K; 19.09.2012
co^␍py ^␍file1 ^␍file2. Я предлагаю вам удалить свой комментарий, чтобы избежать путаницы, тем более, что этот квест очень популярен
- person Borodin; 08.08.2015
<>|"&^ в начале обернутого фрагмента потеряет свое особое значение из-за его экранирования с помощью символа продолжения. Так что начинать каждый завернутый кусок с пробела кажется безопасной привычкой. the line continuation escapes the first character of the next line - @ dbenham, апрель 2012 г.
- person eel ghEEz; 06.03.2019
Правило для каретки:
Каретка в конце строки добавляет следующую строку, первый символ добавленной строки будет экранирован.
Вы можете использовать курсор несколько раз, но полная строка не должна превышать максимальную длину строки ~ 8192 символа (Windows XP, Windows Vista и Windows 7).
echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*
echo Test2
echo one & echo two
--- Output ---
Test2
one
two
echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two
echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two
Чтобы подавить экранирование следующего символа, вы можете использовать перенаправление.
Перенаправление должно быть непосредственно перед курсором. Но есть одно любопытство с перенаправлением перед кареткой.
Если вы поместите маркер на каретку, маркер будет удален.
echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two
echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two
Кроме того, в строку можно встроить перевод строки:
setlocal EnableDelayedExpansion
set text=This creates ^
a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed
Пустая строка важна для успеха. Это работает только с отложенным расширением, иначе остальная часть строки игнорируется после перевода строки.
Это работает, потому что курсор в конце строки игнорирует следующий перевод строки и экранирует следующий символ, даже если следующий символ также является переводом строки (на этом этапе возврат каретки всегда игнорируется).
copy ^[newline]"file1.txt" ^[newline]"file2.txt" не работает! Пришлось добавить пробел: copy ^[newline] "file1.txt" ^[newline] "file2.txt".
- person Alexander Gelbukh; 07.05.2020
...the first character of the appended line will be escaped., вы можете использовать пробел или решение, описанное в To suppress the escaping of the next character you can use a redirection. ...
- person jeb; 07.10.2020
(Это в основном перезапись ответа Уэйна, но с устранением путаницы вокруг каретки. Итак, я опубликовал его как CW. Я не стесняюсь редактировать ответы, но полностью их переписывать кажется неуместным.)
Вы можете разбить длинные строки с помощью каретки (^), просто помните, что каретка и следующая за ней новая строка полностью удаляются из команды, поэтому, если вы поместите ее там, где потребуется пробел ( например, между параметрами), не забудьте также включить пробел (либо перед ^, либо в начале следующей строки, последний выбор может помочь прояснить, что это продолжение).
Примеры: (все протестированы в Windows XP и Windows 7)
xcopy file1.txt file2.txt
можно записать как:
xcopy^
file1.txt^
file2.txt
or
xcopy ^
file1.txt ^
file2.txt
или даже
xc^
opy ^
file1.txt ^
file2.txt
(Последний вариант работает, потому что нет пробелов между xc и ^, и нет пробелов в начале следующей строки. Поэтому, когда вы удаляете ^ и новую строку, вы получаете ..._ 10_.)
Для удобочитаемости и разумности, вероятно, лучше всего разбивать только параметры (обязательно укажите пробел).
Убедитесь, что ^ не последнее место в пакетном файле, так как там кажется серьезной проблемой.
Несколько команд можно заключить в круглые скобки и распределить по многочисленным строкам; так что что-то вроде echo hi && echo hello можно написать так:
( echo hi
echo hello )
Также могут помочь переменные:
set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...
Также я заметил с помощью вставок (^), что условным операторам if нравится, что они следуют только в том случае, если присутствует пробел:
if exist ^
cmd1.bat && cmd2.bat отличается от формы скобок: выполнить cmd2.bat, если cmd1.bat выполнено успешно (-без установки %errorcode%). Последняя форма выполняется безоговорочно. Несколько неожиданным (по крайней мере для меня) является то, что, очевидно, вы не можете использовать комбинацию обоих +, т.е. добавить && перед разрывом строки.
- person Paul Michalik; 19.07.2018
( echo <line break here> hello ) приводит к пустой строке.
- person basickarl; 13.02.2020
Однако кажется, что разделение в середине значений цикла for не требует каретки (и на самом деле попытка использовать ее будет считаться синтаксической ошибкой). Например,
for %n in (hello
bye) do echo %n
Обратите внимание, что даже после приветствия или перед «до свидания» места не требуется.
for: разделителями элементов в for-set являются пробел, запятая, точка с запятой, знак равенства, символ TAB и новые строки.
- person Aacini; 11.02.2016
do часть содержит несколько / вложенных if-else операторов?
- person Vicky Dev; 19.12.2016
Хотя carret будет предпочтительным способом сделать это, вот еще один подход с использованием макроса, который создает команду из переданных аргументов:
@echo off
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set "{{=setlocal enableDelayedExpansion&for %%a in (" & set "}}="::end::" ) do if "%%~a" neq "::end::" (set command=!command! %%a) else (call !command! & endlocal)"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
%{{%
echo
"command"
written
on a
few lines
%}}%
Команду легче читать без вставок, но с использованием специальных символов, например скобки, перенаправление и т. д. сломают его. Так что вы можете это сделать для более простых случаев. Хотя вы все равно можете заключать параметры в двойные кавычки
Одна вещь, которую я не нашел при поиске «как разделить длинную строку командного файла DOS», - это как разделить что-то, содержащее длинный цитируемый текст. На самом деле это описано в ответах выше, но не очевидно. Используйте Карет, чтобы избежать их. например
myprog "needs this to be quoted"
можно записать как:
myprog ^"needs this ^
to be quoted^"
но остерегайтесь начинать строку с каретки после завершения строки с кареткой - потому что она будет отображаться как каретка ..?:
echo ^"^
needs this ^
to be quoted^
^"
- ›необходимо процитировать ^