it-swarm.com.ru

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

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

637
Dan

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

Пример:

copy file1.txt file2.txt

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

copy file1.txt^
 file2.txt
801
Wayne

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

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

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

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

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

240
jeb

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

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

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

59
T.J. Crowder

Несколько команд могут быть помещены в круглые скобки и распределены по многочисленным строкам; так что-то вроде 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 ^
14
Todd Partridge

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

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

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

8
Mohammed Safwat