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

<p>как разделить длинные команды на несколько строк в командном файле?</p>

<p>вы можете разбить длинные строки с помощью каретки <code>^</code>, если помните, что каретка и символ новой строки после нее полностью удалены. итак, если должен быть пробел, где вы ломаете линию, включите пробел. <em> ( <a href="https://stackoverflow.com/a/21000752/157247">подробнее об этом ниже.</a> ) </em></p><p>пример:</p><pre><code>copy file1.txt file2.txt </code></pre><p>будет написано как:</p><pre><code>copy file1.txt^ file2.txt </code></pre>

<p>правило для кареты:</p><p>каретка в конце строки добавляет следующую строку, первый символ добавленной строки будет экранирован.</p><p>вы можете использовать каретку несколько раз, но максимальная длина строки не должна превышать 8192 символа (windows xp, windows vista и windows 7).</p><pre><code>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 </code></pre><p>для подавления выхода следующего символа вы можете использовать перенаправление.</p><p>перенаправление должно быть перед кареткой. но существует одно любопытство с перенаправлением перед каретой.</p><p>если вы поместите токен в каретку, он будет удален.</p><pre><code>echo test5 echo one <nul ^ & echo two --- output --- test5 one two echo test6 echo one <nul thistokenislost^ & echo two --- output --- test6 one two </code></pre><p>и также возможно <strong>вставлять переводы строки</strong> в строку:</p><pre><code>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 </code></pre><p>пустая строка важна для успеха. это работает только с отложенным расширением, иначе остальная часть строки игнорируется после перевода строки.</p><p>это работает, потому что каретка в конце строки игнорирует следующий перевод строки и экранирует следующий символ, даже если следующий символ также является переводом строки (возврат каретки всегда игнорируется в этой фазе).</p>

<p><em> (это в основном переписывание <a href="https://stackoverflow.com/a/69079/157247">ответ уэйна</a> , но с замешательством вокруг каретки прояснилось. поэтому я опубликовал это как cw. я не стесняюсь редактировать ответы, но <strong> полностью переписывать их </strong> кажется неуместным.) </em></p><p>вы можете разбить длинные строки с помощью каретки (<code>^</code>), просто помните, что каретка и символ новой строки, следующий за ней <em>, удаляются полностью </em> из команды, поэтому, если вы поставите ее там, где потребуется пространство (например, между параметрами), также обязательно включите пробел (либо перед <code>^</code>, либо в начале следующей строки - этот последний выбор может помочь сделать его более понятным, что это продолжение).</p><p>примеры: <em> (все протестировано в windows xp и windows 7) </em></p><pre><code>xcopy file1.txt file2.txt </code></pre><p>можно записать как:</p><pre><code>xcopy^ file1.txt^ file2.txt </code></pre><p>или же</p><pre><code>xcopy ^ file1.txt ^ file2.txt </code></pre><p>или даже</p><pre><code>xc^ opy ^ file1.txt ^ file2.txt </code></pre><p>(последнее работает, потому что между <code>xc</code> и <code>^</code> нет пробелов, а в начале следующей строки нет пробелов. поэтому, когда вы удаляете <code>^</code> и символ новой строки, вы получаете ...<code>xcopy</code>.)</p><p>для удобочитаемости и здравомыслия, вероятно, лучше разбивать только между параметрами (обязательно указывайте пробел).</p><p>убедитесь, что <code>^</code> <strong> не является </strong> последней вещью в пакетном файле, как там <a href="https://stackoverflow.com/questions/15466298/simple-caret-in-batch-file-consumes-all-memory">кажется, это серьезная проблема</a> ,.</p>

<p>несколько команд могут быть помещены в круглые скобки и распределены по многочисленным строкам; так что-то вроде <code>echo hi && echo hello</code> можно поставить так:</p><pre><code>( echo hi echo hello ) </code></pre><p>также переменные могут помочь:</p><pre><code>set afilepath="c:\some\long\path\to\a\file" if exist %afilepath% ( start "" /b %afilepath% -option c:\path\to\setting... ) else ( ... </code></pre><p>также я заметил с каретами (<code>^</code>), что условным выражениям <code>if</code> они нравятся, если они следуют только при наличии пробела:</p><pre><code>if exist ^ </code></pre>

<p>тем не менее, кажется, что разбиение по середине значений цикла for не нуждается в каретке (и попытка его использовать будет считаться синтаксической ошибкой). например,</p><pre><code>for %n in (hello bye) do echo %n </code></pre><p>обратите внимание, что после приветствия или до свидания даже не требуется места.</p>