バッチファイルで長いコマンドを複数行に分割するにはどうすればよいですか。
キャレットとそれに続く改行が完全に削除されていることを覚えていれば、キャレット^
で長い行を分割することができます。したがって、改行する場所にスペースがある場合は、スペースを含めてください。 ( 下記の詳細。 )
例:
copy file1.txt file2.txt
ように書かれるでしょう:
copy file1.txt^
file2.txt
キャレットの規則は次のとおりです。
行末のキャレットは次の行を追加します。追加された行の最初の文字はエスケープされます。
キャレットは複数回使用できますが、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
空行は成功のために重要です。これは遅延展開でのみ機能します。それ以外の場合は、改行後の残りの行は無視されます。
次の文字が改行であっても、行末のキャレットが次の改行を無視して次の文字をエスケープするため、これは機能します(キャリッジリターンは常にこのフェーズで無視されます)。
(これは基本的に ウェインの答え の書き直しですが、キャレットをめぐる混乱が解消されたため、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 。
複数のコマンドを括弧で囲み、多数の行にまたがることができます。だから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
こんにちは後やさようならの前にもスペースは必要ないことに注意してください。