web-dev-qa-db-ja.com

Windowsバッチファイルを介して長いコマンドを複数行に分割する

バッチファイルで長いコマンドを複数行に分割するにはどうすればよいですか。

634
Dan

キャレットとそれに続く改行が完全に削除されていることを覚えていれば、キャレット^で長い行を分割することができます。したがって、改行する場所にスペースがある場合は、スペースを含めてください。下記の詳細。

例:

copy file1.txt file2.txt

ように書かれるでしょう:

copy file1.txt^
 file2.txt
795
Wayne

キャレットの規則は次のとおりです。

行末のキャレットは次の行を追加します。追加された行の最初の文字はエスケープされます。

キャレットは複数回使用できますが、1行の最大長は最大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

次の文字のエスケープを抑制するためにリダイレクトを使うことができます。

リダイレクトはキャレットの直前にする必要があります。しかし、キャレットの前にリダイレクトに関する1つの好奇心があります。

キャレットにトークンを置くと、そのトークンは削除されます。

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

空行は成功のために重要です。これは遅延展開でのみ機能します。それ以外の場合は、改行後の残りの行は無視されます。

次の文字が改行であっても、行末のキャレットが次の改行を無視して次の文字をエスケープするため、これは機能します(キャリッジリターンは常にこのフェーズで無視されます)。

239
jeb

(これは基本的に ウェインの答え の書き直しですが、キャレットをめぐる混乱が解消されたため、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^の間にスペースがなく、次の行の先頭にスペースがないためです。したがって、^と改行を削除すると、 get ...xcopy。)

読みやすさと正しさのために、おそらくパラメーター間でのみ分割するのが最善です(必ずスペースを入れてください)。

^notではないことを確認してください。 重大な問題のようです) that

64
T.J. Crowder

複数のコマンドを括弧で囲み、多数の行にまたがることができます。だから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 ^
13
Todd Partridge

しかしながら、forループの値の途中で分割することはキャレットを必要としないようです(そして実際にそれを使おうとすることは構文エラーとみなされるでしょう)。例えば、

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

こんにちは後やさようならの前にもスペースは必要ないことに注意してください。

8
Mohammed Safwat