876

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

4

7 に答える 7

1094

^カレットとそれに続く改行が完全に削除されていることを覚えている限り、カレットで長い行を分割できます。したがって、境界線を壊すスペースがある場合は、スペースを含めます。詳細は以下をご覧ください。

例:

copy file1.txt file2.txt

次のように記述されます:

copy file1.txt^
 file2.txt
于 2008-09-16T03:06:37.857 に答える
312

キャレットのルールは次のとおりです。

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

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

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

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

于 2010-12-15T22:48:39.713 に答える
99

(これは基本的にウェインの回答を書き直したものですが、キャレットの混乱が解消されました。したがって、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。)

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

がバッチ ファイルの最後に^ならないように注意してください。これには大きな問題があるようです。

于 2014-01-08T16:07:18.037 に答える
24

複数のコマンドを括弧で囲み、多数の行にまたがることができます。したがって、次のようなものを次のよう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 ^
于 2016-02-12T19:55:11.617 に答える