Разделение длинных команд на несколько строк через пакетный файл Windows - PullRequest
636 голосов
/ 16 сентября 2008

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

Ответы [ 5 ]

798 голосов
/ 16 сентября 2008

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

Пример:

copy file1.txt file2.txt

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

copy file1.txt^
 file2.txt
240 голосов
/ 16 декабря 2010

Правило каретки:

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

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

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

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

59 голосов
/ 08 января 2014

(Это в основном переписывание ответа Уэйна , но с разборчивостью вокруг каретки прояснилось. Так что я опубликовал это как 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.)

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

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

14 голосов
/ 12 февраля 2016

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...