Длинные команды разделены на несколько строк в пакете Windows Vista (.Bat-файл



Как сделать длинные команды идут по нескольким строкам в пакетном файле Windows (Vista)?

757   5  

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

и это также возможно встроить линии питания в строку:

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. Я не стесняюсь редактировать ответы, но полностью переписать их кажется неуместным.)

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

примеры: (все протестировано на 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 ^

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

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

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

Comments

    Ничего не найдено.