Розбийте довгі команди на кілька рядків через пакетний файл Windows


Відповіді:


917

Ви можете розірвати довгі лінії з каретою до ^тих пір, поки пам’ятаєте, що карета та нова лінія, що слідує за нею, повністю видалені. Отже, якщо має бути пробіл, де ви перериваєте лінію, додайте пробіл. ( Детальніше про це нижче. )

Приклад:

copy file1.txt file2.txt

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

copy file1.txt^
 file2.txt

95
Наступний рядок можна починати без пробілу, якщо ви додасте пробіл перед ^текстом команди та після нього.
Джозеф Дайгл

4
@SebaIllingworth - Ні, ви завжди можете додати [SPACE] + [^] та два порожні рядки, щоб створити загальну кількість 2 каналів рядків під час echoредагування.
Джеймс К

12
Для безпеки завжди
закінчуйте

4
@GavinMiller: " caret ^ після копіювання та file1.txt у новому рядку не працюватиме" Це неправда. Ви можете розділити рядок де завгодно, у тому числі в середині слова, як co^␍py ^␍file1 ^␍file2. Я пропоную вам видалити свій коментар, щоб уникнути плутанини, тим більше, що цей квест є таким популярним
Бородін

3
Тут є те, що ^ повинен бути останнім символом у рядку - тобто після пробілів немає пробілів. У мене виникли проблеми з цим, і виявилося, що після карети у мене є пробіл - це не легко видно в редакторі, яким я користувався.
GregHNZ

266

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

Карета в кінці рядка додає наступний рядок, перший символ доданого рядка буде уникнути.

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

Порожній рядок важливий для успіху. Це працює лише із затримкою розширення, інакше решта рядка ігнорується після подачі рядка.

Це працює, тому що карета в кінці рядка ігнорує наступний канал рядка і уникає наступного символу, навіть якщо наступний символ також є каналом рядка (повернення каретки завжди ігноруються на цій фазі).


Заключний блок коду з прикладом подачі рядка не відображає порожній рядок, навіть якщо він є. (Принаймні, це не відображається в IE7) Спробуйте переформатувати за допомогою блокчету.
dbenham

5
Питання полягає в тому, чи варто підтримувати поганий інструмент, який не дотримувався правил (хтось називає його браузером, але це не так) чи вам слід перейти на браузер?
jeb

1
У мене були подвійні лапки навколо моїх значень, як у наборі var = "текст тут ^", але це не працює. Видаліть подвійну цитату, і це добре.
rjt

1
@jeb, написав приклад невдачі CMD скрипта, але потім знайшов це питання: stackoverflow.com/questions/4643376 / ...
RJT

Це не працює, якщо наступний рядок починається з лапки: copy ^[newline]"file1.txt" ^[newline]"file2.txt"не працює! Я повинен був додати пробіл: copy ^[newline] "file1.txt" ^[newline] "file2.txt".
Олександр Гельбух

70

(Це в основному переписування відповіді Уейна, але з розмиттю навколо карети з'ясувалося. Тому я розмістив це як КВ. Я не соромлюсь редагувати відповіді, але повністю переписувати їх видається недоцільним.)

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

Приклади: (все тестовано на 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)

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

Будьте впевнені, що ^це не остання річ у пакетному файлі, оскільки, мабуть, є основна проблема з цим .


18

Кілька команд можна поставити в дужки і розподілити по численним рядкам; тому щось подібне 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 ^

1
Рядок cmd1.bat && cmd2.batвідрізняється від форми паронів: виконувати cmd2.batiff, що cmd1.batвиконується успішно (без налаштування %errorcode%). Остання форма виконується беззастережно. Дещо несподіваним (принаймні для мене) є те, що, очевидно, ви не можете використовувати комбінацію обох + тобто додати &&до розриву рядка.
Пол Міхалик

( echo <line break here> hello )приводить до порожнього рядка.
Карл Моррісон

найкраща та найчистіша відповідь! піклування некрасиві та проблемні в регулярному
вираженні

9

Однак, здається, що для розбиття в середині значень циклу не потрібна карета (і насправді спроба використовувати її буде вважатися помилкою синтаксису). Наприклад,

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

Зауважте, що ніколи не потрібно місця після привіт або перед побаченням.


Звичайно, це частина forсинтаксису: роздільниками елементів у "for-set" є пробіл, кома, крапка з комою, знак рівності, символ TAB та нові рядки.
Аакіні

Але що робити, якщо doчастина містить кілька / вкладених if-elseвисловлювань?
Вікі Дев

Тоді ви можете просто використовувати круглі дужки , щоб докласти заяви , як для% п в (привіт до побачення) робити (відлуння% п відлуння% п)
Мохаммед Сафват
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.