Длинные команды разделены на несколько строк в пакете Windows Vista (.Bat-файл
Как заставить длинные команды проходить через несколько строк в пакетном файле Windows (Vista)?
5 ответов
вы можете разбить длинные строки с помощью каретки ^
пока вы помните, что курсор и новая строка, следующая за ним, полностью удалены. Итак, если должно быть пространство, где вы нарушаете линию, включите пространство. (подробнее об этом ниже.)
пример:
copy file1.txt file2.txt
было бы написано как:
copy file1.txt^
file2.txt
правило для каретки:
курсор в конце строки, добавляет следующую строку, первый символ добавленной строки будет экранирован.
вы можете использовать Курсор несколько раз, но полная строка не должна превышать максимальную длину строки ~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
и это также возможно embed line feeds в строку:
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
пустая строка важна для успеха. Это работает только с задержкой расширения, иначе остальная часть линии игнорируется после подачи линии.
он работает, потому что каретка на конце линии игнорирует следующая подача строки и экранирует следующий символ, даже если следующий символ также является подачей строки (возврат каретки всегда игнорируется на этом этапе).
(это в основном рерайт ответ Уэйна но с путаницей вокруг каретки прояснилось. Поэтому я разместил его как CW. Я не стесняюсь редактировать ответы, но полностью переписать их кажется неуместным.)
вы можете разбить длинные строки с помощью каретки (^
), просто помните, что каретка и новая строка, которая следует за ней полностью удалены из команды, поэтому, если вы поместите его туда, где пространство потребуется (например, между параметрами), обязательно включите пространство (либо перед ^
, или в начале следующей строки-Этот последний выбор может помочь сделать его более ясным, это продолжение).
примеры: (все протестировано на 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
.)
для читаемости и здравомыслия, вероятно, лучше всего разбивать только между параметрами (обязательно включать пространство).
убедитесь, что ^
is не последнее в пакетном файле, как там кажется, это серьезная проблема с этим.
несколько команд могут быть заключены в скобки и распределены по многочисленным строкам; так что что-то вроде 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
conditionals хотели, чтобы они следовали, только если пространство присутствовало:
if exist ^
Кажется, однако, что разделение в середине значений цикла for не требует каретки (и фактически попытка использовать ее будет считаться синтаксической ошибкой). Например,
for %n in (hello
bye) do echo %n
обратите внимание, что пространство не требуется даже после hello или до bye.