長いコマンドをバッチファイルの複数の行に分割するにはどうすればよいですか?
7 に答える
^
カレットとそれに続く改行が完全に削除されていることを覚えている限り、カレットで長い行を分割できます。したがって、境界線を壊すスペースがある場合は、スペースを含めます。(詳細は以下をご覧ください。)
例:
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
次の文字のエスケープを抑制するには、リダイレクトを使用できます。
リダイレクトは、キャレットの直前にある必要があります。しかし、キャレットの前にリダイレクトがあるという興味深い点が 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
(これは^
、 と の間にスペースがなく、次の行の先頭にスペースがないため、最後に機能します。したがって、^
と改行を削除すると、... が得られます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 ^