Як я можу розділити довгі команди на кілька рядків у пакетному файлі?
Як я можу розділити довгі команди на кілька рядків у пакетному файлі?
Відповіді:
Ви можете розірвати довгі лінії з каретою до ^
тих пір, поки пам’ятаєте, що карета та нова лінія, що слідує за нею, повністю видалені. Отже, якщо має бути пробіл, де ви перериваєте лінію, додайте пробіл. ( Детальніше про це нижче. )
Приклад:
copy file1.txt file2.txt
буде записано як:
copy file1.txt^
file2.txt
echo
редагування.
co^␍py ^␍file1 ^␍file2
. Я пропоную вам видалити свій коментар, щоб уникнути плутанини, тим більше, що цей квест є таким популярним
Правило для карети:
Карета в кінці рядка додає наступний рядок, перший символ доданого рядка буде уникнути.
Ви можете використовувати карету кілька разів, але повна лінія не повинна перевищувати максимальну довжину рядка ~ 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
Порожній рядок важливий для успіху. Це працює лише із затримкою розширення, інакше решта рядка ігнорується після подачі рядка.
Це працює, тому що карета в кінці рядка ігнорує наступний канал рядка і уникає наступного символу, навіть якщо наступний символ також є каналом рядка (повернення каретки завжди ігноруються на цій фазі).
copy ^[newline]"file1.txt" ^[newline]"file2.txt"
не працює! Я повинен був додати пробіл: copy ^[newline] "file1.txt" ^[newline] "file2.txt"
.
(Це в основному переписування відповіді Уейна, але з розмиттю навколо карети з'ясувалося. Тому я розмістив це як КВ. Я не соромлюсь редагувати відповіді, але повністю переписувати їх видається недоцільним.)
Ви можете розбити довгі рядки за допомогою карети ( ^
), просто пам’ятайте, що карета та новий рядок, що слідує за нею , повністю видалені з команди, тому, якщо ви поставите її там, де потрібно буде пробіл (наприклад, між параметрами), будьте впевнені також включити пробіл (або перед ^
, або на початку наступного рядка - цей останній вибір може допомогти зрозуміти, що це продовження).
Приклади: (все тестовано на 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
)
Щодо читабельності та розумності, мабуть, найкраще порушувати лише параметри (обов’язково вкажіть пробіл).
Будьте впевнені, що ^
це не остання річ у пакетному файлі, оскільки, мабуть, є основна проблема з цим .
Кілька команд можна поставити в дужки і розподілити по численним рядкам; тому щось подібне 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 ^
cmd1.bat && cmd2.bat
відрізняється від форми паронів: виконувати cmd2.bat
iff, що cmd1.bat
виконується успішно (без налаштування %errorcode%
). Остання форма виконується беззастережно. Дещо несподіваним (принаймні для мене) є те, що, очевидно, ви не можете використовувати комбінацію обох + тобто додати &&
до розриву рядка.
( echo <line break here> hello )
приводить до порожнього рядка.
Однак, здається, що для розбиття в середині значень циклу не потрібна карета (і насправді спроба використовувати її буде вважатися помилкою синтаксису). Наприклад,
for %n in (hello
bye) do echo %n
Зауважте, що ніколи не потрібно місця після привіт або перед побаченням.
for
синтаксису: роздільниками елементів у "for-set" є пробіл, кома, крапка з комою, знак рівності, символ TAB та нові рядки.
do
частина містить кілька / вкладених if-else
висловлювань?
^
текстом команди та після нього.