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

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

вопрос задан 16.09.2008
Andrew Swan
8632 репутация

5 ответов


  • 0 рейтинг

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

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

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

    ответ дан T.J. Crowder, с репутацией 655295, 8.01.2014
  • 0 рейтинг

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

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

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

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

    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
    

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

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

    ответ дан jeb, с репутацией 56196, 15.12.2010
  • 0 рейтинг

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

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

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

    ответ дан Mohammed Safwat, с репутацией 71, 24.08.2014
  • 0 рейтинг

    Несколько команд могут быть заключены в круглые скобки и распределены по многочисленным строкам; так что-то вроде 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 ^
    
    ответ дан Todd Partridge, с репутацией 185, 12.02.2016
  • 0 рейтинг

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

    Пример:

    copy file1.txt file2.txt
    

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

    copy file1.txt^
     file2.txt
    
    ответ дан Wayne, с репутацией 25946, 16.09.2008