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


回答:


919

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

例:

copy file1.txt file2.txt

次のように書きます:

copy file1.txt^
 file2.txt

95
^コマンドテキストの前後にスペースを追加すると、スペースなしで次の行を開始できます。
ジョセフデイグル

4
@SebaIllingworth-いいえ、いつでも[SPACE] + [^]と2つの空白行を追加して、echo編集時に合計2つの改行を作成できます。
James K

12
安全のため、キャレットを使用するときは常に空白行で終了してください。バッチファイルのシンプルカラットがすべてのメモリを消費するを
マットウィルキー

4
@GavinMiller:「キャレット^後のコピーと新しい行のfile1.txtは機能しませんこれは正しくありません。のように、単語の途中を含め、どこにでも行を分割できco^␍py ^␍file1 ^␍file2ます。混乱を避けるために、コメントを削除することをお勧めします。特に、この質問は非常に人気があるため
Borodin

3
ここで1つ問題があるのは、^は行の最後の文字でなければならないということです。つまり、後にスペースを入れません。私はこれで問題を抱えていて、キャレットの後にスペースがたくさんあることがわかりました-使用していたエディターでは簡単には見えません。
GregHNZ 2017

266

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

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

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

空行は成功のために重要です。これは遅延拡張でのみ機能します。それ以外の場合、ラインフィード後の行の残りは無視されます。

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


改行の例を含む最後のコードブロックでは、空白行があっても表示されません。(少なくともIE7では表示されません)代わりにブロック引用符を使用して再フォーマットしてください。
dbenham

5
問題は、ルールに従わない悪いツール(誰かがそれをブラウザーと呼んでも、そうではない)をサポートする必要があるのか​​、それともブラウザーに切り替えるべきなのか、です。
ジェブ

1
set var = "text here ^"のように、値を二重引用符で囲みましたが、機能しません。二重引用符を削除すれば問題ありません。
rjt

1
@jeb、CMDスクリプトを失敗例を書きましたが、その後、この質問が見つかりました: stackoverflow.com/questions/4643376/...
RJTを

次の行が引用符で始まる場合、これは機能しません:copy ^[newline]"file1.txt" ^[newline]"file2.txt"機能しません!スペースを追加する必要がありました:copy ^[newline] "file1.txt" ^[newline] "file2.txt"
Alexander Gelbukh

70

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

(betwenスペースがないので、最後に動作していることxcと、^あなたが削除すると、次の行の先頭にスペースなしで。^と改行を、あなたが得ます... xcopy。)

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

大きな問題があるように思われるので、がバッチファイルの最後のもので^ないことを確認してください。


18

複数のコマンドを括弧で囲み、多数の行にまたがることができます。ので、次のよう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 ^

1
この行cmd1.bat && cmd2.batは、括弧の形式とは異なります:正常に実行されたcmd2.batiffをcmd1.bat実行します(-settingなし%errorcode%)。後者の形式は無条件に実行されます。(少なくとも私にとっては)やや予期しないことは、明らかに、両方の組み合わせを使用できないこと&&です。つまり、改行の前に追加します。
Paul Michalik

( echo <line break here> hello )空行になります。
カールモリソン

最良かつ最もきれいな答え!キャレットは醜く、正規表現で問題があります
neoscribe

9

ただし、forループの値の途中で分割する場合、キャレットは必要ないようです(実際にキャレットを使用しようとすると、構文エラーと見なされます)。例えば、

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

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


もちろん、これはfor構文の一部です。「for-set」の要素の区切り文字は、スペース、コンマ、セミコロン、等号、TAB文字、および改行です。
Aacini、2016

しかし、doパーツに複数の/ネストされたif-elseステートメントが含まれている場合はどうなりますか?
Vicky Dev

次に、括弧を使用して、%n in(hello bye)do(echo%n echo%n)のようにステートメントを囲むことができます
Mohammed
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.