Разделение длинных команд на несколько строк через пакетный файл Windows

Как разделить длинные команды на несколько строк в командном файле?

16.09.2008 03:04:34
5 ОТВЕТОВ
РЕШЕНИЕ

Вы можете разбить длинные строки с помощью каретки, ^если помните, что каретка и символ новой строки после нее полностью удалены. Итак, если должен быть пробел, где вы ломаете черту, включите пробел. ( Подробнее об этом ниже. )

Пример:

copy file1.txt file2.txt

будет написано как:

copy file1.txt^
 file2.txt
900
6.11.2017 16:24:20
Вы можете начать следующую строку без пробела, если вы добавите пробел непосредственно перед ^и после текста вашей команды.
Joseph Daigle 16.09.2008 03:21:46
Кажется, ограничены только первые две дополнительные строки?
Seba Illingworth 31.07.2010 02:47:56
@SebaIllingworth - Нет, вы всегда можете добавить [ПРОБЕЛ] + [^] и две пустые строки, чтобы создать всего 2 перевода строки при редактировании echo.
James K 18.09.2012 23:26:37
В целях безопасности всегда используйте пустую строку при использовании каретки, см. Простой карат в пакетном файле
matt wilkie 8.10.2013 20:19:54
@GavinMiller: « символ вставки ^ после копирования и file1.txt в новой строке не будут работать». Это неправда. Вы можете разбить строку в любом месте, в том числе в середине слова, как co^␍py ^␍file1 ^␍file2. Я предлагаю вам удалить свой комментарий, чтобы избежать путаницы, тем более что этот вопрос такой популярный
Borodin 7.08.2015 21:49:34

Правило для кареты:

Каретка в конце строки добавляет следующую строку, первый символ добавленной строки будет экранирован.

Вы можете использовать каретку несколько раз, но максимальная длина строки не должна превышать ~ 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

Пустая строка важна для успеха. Это работает только с отложенным расширением, иначе остальная часть строки игнорируется после перевода строки.

Это работает, потому что каретка в конце строки игнорирует следующий перевод строки и экранирует следующий символ, даже если следующий символ также является переводом строки (возврат каретки всегда игнорируется в этой фазе).

262
24.08.2018 19:56:57
Последний блок кода с примером перевода строки не отображает пустую строку, даже если она там есть. (По крайней мере, это не отображается в IE7) Попробуйте переформатировать, используя вместо этого цитату.
dbenham 22.11.2011 23:15:00
Вопрос в том, должны ли мы поддерживать плохой инструмент, который не следует правилам (кто-то называет это браузером, но это не так), или вам следует переключиться на браузер?
jeb 24.11.2011 12:02:38
у меня были двойные кавычки, окружающие мои значения, как в set var = "text here ^", но это не работает. Удалите двойную кавычку, и это нормально.
rjt 5.04.2016 20:55:20
@jeb, написал пример неудачного сценария cmd, но затем нашел этот вопрос: stackoverflow.com/questions/4643376/…
rjt 6.04.2016 12:46:13

(Это, в основном, переписывание ответа Уэйна, но с путаницей вокруг прояснения каретки. Так что я опубликовал это как CW. Я не стесняюсь редактировать ответы, но полностью переписывать их кажется неуместным.)

Вы можете разбить длинные строки с помощью caret ( ^), просто помните, что символ вставки и последующий символ строки полностью удаляются из команды, поэтому, если вы поставите его там, где потребуется пробел (например, между параметрами), убедитесь, что также включить пробел (либо перед ^, либо в начале следующей строки - этот последний выбор может помочь прояснить, что это продолжение).

Примеры: (все протестировано на Windows XP и Windows 7)

xcopy file1.txt file2.txt

можно записать как:

xcopy^
 file1.txt^
 file2.txt

или

xcopy ^
file1.txt ^
file2.txt

или даже

xc^
opy ^
file1.txt ^
file2.txt

(Это последнее работает, потому что между пробелами xcи ^и нет пробелов, а в начале следующей строки пробелов нет. Поэтому, когда вы удаляете ^и новую строку , вы получаете .... xcopy)

Для удобочитаемости и здравомыслия, вероятно, лучше разбивать только между параметрами (не забудьте указать пробел).

Убедитесь, что ^это не последнее, что есть в командном файле, так как это, похоже, является серьезной проблемой .

67
23.05.2017 11:54:50

Тем не менее, кажется, что разбиение по середине значений цикла for не нуждается в каретке (и попытка его использовать будет считаться синтаксической ошибкой). Например,

for %n in (hello
bye) do echo %n

Обратите внимание, что после приветствия или до свидания даже не требуется места.

9
24.08.2014 11:07:50
Конечно, это является частью forсинтаксиса: разделителями элементов в «for-set» являются пробел, запятая, точка с запятой, знак равенства, символ табуляции и новые строки.
Aacini 11.02.2016 16:07:12
Но что если doчасть содержит несколько вложенных if-elseоператоров?
Vicky Dev 19.12.2016 19:59:04
Тогда вы можете просто использовать круглые скобки, чтобы заключить в себе операторы, как для% n в (привет пока) do (echo% n echo% n)
Mohammed Safwat 27.12.2016 22:39:04

Несколько команд могут быть заключены в круглые скобки и распределены по нескольким строкам; так что-то вроде 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 (
...

Также я заметил с помощью carets ( ^), что ifусловные выражения им нравятся, если они присутствуют только при наличии пробела:

if exist ^
17
12.02.2016 19:55:11
Строка cmd1.bat && cmd2.batотличается от формы parens: выполняется, cmd2.batесли cmd1.batвыполняется успешно (-без настройки %errorcode%). Последняя форма выполняется безоговорочно. Несколько неожиданным (по крайней мере для меня) является то, что, очевидно, вы не можете использовать комбинацию обоих +, то есть добавить &&до разрыва строки.
Paul Michalik 19.07.2018 09:45:00
( echo <line break here> hello )приводит к пустой строке.
Karl Morrison 13.02.2020 14:52:48