バッチファイルの改行をエコーするにはどうすればよいですか?


642

どのようにしてバッチファイル出力から改行を挿入できますか?

私は次のようなことをしたいです:

echo hello\nworld

どちらが出力されます:

hello
world

6
役に立ちました。エコーしなければなりませんでした\ n \ n | スクリプト内のmy_app.exe。私はしました(echo。&& echo。)| my_app.exe
Vignesh

2
簡単なアプローチ "コードの開始:"> echo hello&echo world、uに必要なものを提供します
prudviraj

1
非表示のascii chr(255)を別の行に挿入すると、空白行が強制的に挿入されます。[alt]キーを押しながら、キーパッドで255を押します。これにより、空白の正方形であるchr(255)が挿入されます。つまり、「echo(alt + 255)」キーパッドのみを使用できます。キーティキーボードの上部にある数字は使用できません。
jwzumwalt

コンピューターの修理の半分がプラグを差し込んで電源を入れるのと同じように、ソフトウェア開発の半分は私が宇宙工学と呼んでいるものです。私たちは、必要なだけのように私たちの空白行を。
Bob Stein

これはどう ?echo Yes&echo No
scientist_7

回答:


462

echo hello & echo.world

これは& echo.、改行の定数として定義できることを意味します\n


43
例では、期間を必要としませんが、あなたは空白の空行エコーする必要性のいずれかを実行しますecho. && echo hello && echo. && echo world
マットウィルキー

4
これを単一のエコーで実行して、ファイルにリダイレクトできるようにすることはできますか?
Shahbaz

46
@Shahbaz -$ (echo Hello && echo World) > ./File.txt
ネイサンJB

25
「エコー」の時代物。私を驚かせることは決してありません。それはとても時代遅れですが、ドットはコマンド名との間にスペースを入れずに厳密に連結する必要があることをいつも忘れています。あなたの投稿にエラーはありません。これはリマインダーとして「エコー」と書いています。!= "エコー"。!
ケツァルコアトル2012

5
@quetzalcoatl、それはさらに奇妙になります。ドット以外の文字も機能します。SS64は、より良い構文はecho(パフォーマンスを向上させるためのものだと言います(まだスペースを気にしないでください)。ECHO
失敗

558

使用する:

echo hello
echo.
echo world

16
単一のエコーステートメント内で文字列を提供することは可能ですか?
ブライアンR.ボンディ

5
なぜ単一のエコーステートメントでそれを行う必要があるのですか。別のものを持っていることの害はどこですか?
Rob

3
@ロブ、私はちょうどこの問題に出くわしました、そしてこれらの仕事のどれも。私の例では、単一のステートメントでエコーする必要があります。HTMLからいくつかのtexファイルを生成し、echo "Makefile contents (which has \n)" > Makefile複数のエコーを使用してMakefileを生成していますが、機能しません
Shahbaz

3
:使用&(または&&)単一のステートメントでそれらを行うには:TXTファイルには、例えば置くために「こんにちは\ nworld」(echo hello & echo world) >> ./test.txt
ネッド・マーティン

4
ファイルへの複数行出力の場合は、次のことを行ってみませんか? echo line 1 > Makefileそしてecho line 2 >> Makefile。を使用する>>と、出力がファイルに追加されます。これは、この場合に必要な動作です。
dgnuff

141

ここで、次の内容を含む.batファイルを作成します。

@echo off
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
REM Example Usage:
echo There should be a newline%NL%inserted here.

echo.
pause

次のような出力が表示されます。

There should be a newline
inserted here.

Press any key to continue . . .

もちろん、REMステートメントの間のコードだけが必要です。


51
非常に印象的ですが、NL = ^^^%NLM %% NLM%^%NLM %% NLM%がどのように機能するかを説明していただけませんか?私はそれを完全に理解することができません
アンディ・モリス

8
@andy methinks 8つのコメントワラント質問:stackoverflow.com/questions/6379619/...
マットウィルキー

82
これは、cmd.exeとWindowsバッチファイルがまったく正気でないことを示す素晴らしい例です。
mivk

12
自己紹介:「set NLM = ^」という行は、CARETの後に何もない必要あり、その後に2行の空白行が必要です。
mnemotronic 2015年

4
より簡単な方法については、私の答えを参照してください。 set nl=^&echo.echo hello %nl% world同じ効果が得られます。
coltonon

96

echo:cmd / bat-filesには空白行を書き込む標準機能があり、cmd-outputの新しい行をエミュレートします。

@echo off
@echo line1
@echo:
@echo line2

上記のcmd-fileの出力:

line1

line2

37
実際、未使用の特殊文字はすべて機能するはずです。スラッシュはコマンドオプションの標準文字であるため、私は常に/の使用を推奨しています。また、Microsoftの誰かが残念ながら選択したドットの使用を常に批判しています。これは、echo.comコマンドがMS-DOS / Windowsバッチコマンドプロセッサのバージョンによって異なる結果を与えるためです。
Aacini、2011

21
常に機能する唯一のバージョンはecho(です。問題を引き起こす可能性があるように見えますが、実際には完全に機能します。他のすべての形式には、コマンドが期待どおりに実行されない状況が少なくとも1つあります。
dbenham 2013年

5
@naxa-公式なものは何もありません。数人のバッチハッカーによって得られた集合的な知識だけです。目標は、何も含まずに任意の値をECHOするために使用できる構文を用意することであり、期待されるもの以外のものを取得することを心配する必要はありません。私が知っている最良の要約はdostips.com/forum/viewtopic.php?p=4554#p4554にあります。それは一種のあなたをぶら下げますが、誰もECHO(失敗したシナリオを考え出したことがありません。
dbenham 2014

2
@Pacerier-これらの提案のそれぞれに失敗の例があります。dostips.com/forum/viewtopic.php?p=4554#p4554をよくお読みください
dbenham 2015

2
@Pacerier スタンドアロンの質問に対して十分なエコーが発生しています。たぶん、「すぐにフォローできるキャラクターechoとその効果は何か?」
マットウィルキー2015

68

ケンの答えと同じですが、遅延拡張を使用します。

setlocal EnableDelayedExpansion
(set \n=^
%=Do not remove this line=%
)

echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"

最初に、単一の改行文字が作成され、\ n変数に割り当てられます。
これは、行末のキャレットが次の文字をエスケープしようとするときに機能しますが、これが改行の場合は無視され、次の文字が読み取られてエスケープされます(これも改行である場合でも)。
次に、現在の命令を終了するために3番目の改行が必要です。そうでない場合、3番目の行はLF変数に追加されます。
パーサーのこのフェーズではCRが削除されるため、バッチファイルでも行末がCR / LFであるLFのみが重要です。

遅延展開を使用する利点は、特別な文字処理がまったくないことです。
echo Line1%LF%Line2パーサーは単一の改行で解析を停止するため、失敗します。

詳細な説明は
、Vista / DOSバッチ(.bat)ファイルで複数行に分割されたSO:Longコマンドにあります。SO
:Windowsコマンドインタープリター(CMD.EXE)はスクリプトをどのように解析しますか?

編集:避ける echo.

質問はecho複数の行を出力する可能性がある単一の問題であったため、これは質問の答えにはなりません。

しかし、を使用echo.して新しい行を作成することを提案している他の回答にもかかわらず、echo.cmd.exeが名前の付いたファイルを検索しECHOて開始しようとするため、非常に遅く、完全に失敗する可能性があるため、これが最悪であることに注意してください。

空の行だけを印刷するには、次のいずれかを使用できます

echo,
echo;
echo(
echo/
echo+
echo=

ただし、スクリプトの実行場所(ネットワークドライブなど)によっては非常に遅くなる可能性があるためecho.echo\またはの使用はecho:避けてください。


1
たとえば、改行を含む文字列をパラメータとしてバッチサブルーチンに渡す場合、改行が途中で解釈されないようにするために、call :pause line1!\n!line2サブルーチンを開始しsetlocal EnableDelayedExpansionて終了しsetlocal DisableDelayedExpansionます。
stevek_mcc

2
キャラクターのキャストecho, echo; echo( echo/ echo+ echo=とローグギャラリーの+1 echo. echo\ echo:。さて、なぜこれらの仕事を聖別して説明するのであれば、私はあなたに無料のビールを借りたいと思います。
Bob Stein

40

echo. 十分に言った。

1行で必要な場合は、 &。例えば、

echo Line 1 & echo. & echo line 3

次のように出力されます:

Line 1

line 3

さて、もう少し凝ったものが欲しいと言ったら...

set n=^&echo.
echo hello %n% world

アウトプット

hello
world

次に、単に %n%、echoステートメントで新しい行が必要なときにいつでもます。これは\n、さまざまな言語で使用されているものにより近いものです。

壊す

set n= 変数を設定します n値に。

^ 次のシンボルを無効にします。

&同じ行で別のコマンドを実行することを意味します。エラーレベル(大声で叫ぶためのエコーステートメント)は気にしないので、&&必要あり。

echo. エコーステートメントを続行します。

コードである変数を実際に作成し、他のコマンド内でそれらを使用できるため、これらすべてが機能します。バッチはまさにシェルスクリプト言語の最も高度なものではないため、これはゲットー関数のようなものです。これが機能するのは、バッチの変数の使用が不十分であり、int、char、float、stringなどを自然に指定しないためです。

あなたが狡猾であるならば、あなたはこれを他のもので機能させることができます。たとえば、それを使用してタブをエコーする

set t=^&echo.     ::there are spaces up to the double colon

7
echo.最初にその名前でファイルを検索しようとするため、使用しないでください。次のような他の句読点を使用しますecho,
モニカを復活させる'22

20

エコーしてファイルにリダイレクトする場合、複数のエコーコマンドは機能しません。多分「>>」リダイレクタが良い選択だと思います:

こんにちはこんにちは> temp
エコーワールド>>温度

8
最初の例は ">"を使用して新しいファイルを作成し、2番目の例は ">>"を使用して既存のファイルに追加します(または、まだ存在しない場合は作成します)。
Yann Duran

1
(echo hello && echo world) > tempNathan J. Brauerが(現在の)承認された回答作品へのコメントで言及しました。
GeroldBroserがモニカ2016

15

Grimtronが示唆するように、これを定義する簡単な例を次に示します。

@echo off
set newline=^& echo.
echo hello %newline%world

出力

C:\>test.bat
hello
world

実際には、「ワールド」の後に追加の改行がエコーされます
BlueRaja-Danny Pflughoeft '10 / 06/15

1
@blue末尾の改行は、バッチファイル自体の機能のようです。echo hello %newline%world行を繰り返す場合、間にスペースはありません。
マットウィルキー

2
echo "Hello %newline% world"引用符の中にあるため失敗します。それは本当の改行ではないからです。
ジェブ

14

結果をファイルに書き込む必要がある場合は、

(echo a & echo. & echo b) > file_containing_multiple_lines.txt

9

このようにすることもできます

(for %i in (a b "c d") do @echo %~i)

出力は、

a
b
c d

これをバッチファイルに入れると、 '%'が2倍になることに注意してください。

(for %%i in (a b "c d") do @echo %%~i)

このソリューションは、改行ではなくアンパサンド&をエコーし​​たい場合にも機能します。
parvus 14年

私はバグを見つけたと思います:*char

7

MINGW make makefileから空白行をエコーするために誰かがここに来た場合、私は

@cmd /c echo.

単に使用するecho.と、恐ろしい原因になりますprocess_begin: CreateProcess(NULL, echo., ...) failed.エラーメッセージが表示されます。

これが少なくとも他の人の役に立つことを願っています:)


しかし、それは問題ではありません。反対投票!
Mesalcode

皮肉かどうかわからない:P
ウェインウロダ

受信トレイを見て調べてください:D
Mesalcode

3

変数に渡すことができる文字列リテラルで有名な\ nを使用する必要がある場合は、以下のHello.batスクリプトのようなコードを記述できます。

@echo off
set input=%1
if defined input (
    set answer=Hi!\nWhy did you call me a %input%?
) else (
    set answer=Hi!\nHow are you?\nWe are friends, you know?\nYou can call me by name.
)

setlocal enableDelayedExpansion
set newline=^


rem Two empty lines above are essential
echo %answer:\n=!newline!%

この方法で、複数行の出力を1か所で作成し、他のスクリプトまたは外部ファイルで作成し、別の場所で印刷することができます。

改行改行変数に保持されます。その値が代入されなければならないの後にエコーラインは、私が使用して展開されているSETLOCAL enableDelayedExpansionを実行に変数を展開する感嘆符記号を有効にします。そして、実行は\ n改行の内容に置き換えますヘルプセットで構文を探してください)。もちろん、!newlineを使用することもできます。設定しながら答えをしかし、\ nはより便利です。それは外部から渡される可能性があります(Hello R2 \ nD2を試してください)。そこでは、改行を保持する変数の名前が誰にもわかりません(はい、Hello C3!newline!P0 同じように動作します)。

上記の例は、次のように使用して、サブルーチンまたはスタンドアロンバッチに改良できますcall:mlecho Hi\nI'm your comuter

:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^


echo %text:\n=!nl!%
goto:eof

バックスラッシュを追加しても、スクリプトによる部分文字列の解析が妨げられないことに注意してください。


1
あなたは本質的に上記のジェブの答えと同じことをしています。
スカッシュマン2018年

上記で読んだ回答は非常に役に立ちましたが、解析するスクリプトodサブルーチンを呼び出す必要があったため、どこにもトリックを実装することは避けました。これはソリューションを改善する必要があり、私はこの改善を共有しました。それがどんな動物にも害を及ぼさなかったことを願っています。
Tomator

2

これは私にとってはうまくいきました、遅延拡張は必要ありません:

@echo off
(
echo ^<html^> 
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause

次のような出力を書き込みます。

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .

4
-1 echo asdf >myfile.txtはまったく同じ結果を生成します。 echo文字列の最後に改行を追加します。
BlueRaja-ダニープフルフフト

2
カッコを改行に使用することの価値を認めた唯一の人物であることは素晴らしい答えです。これは、DOSのメーカーがあなたがそうすることを意図した方法だと私は信じています。
djangofan 2013

2

新しい行をバッチで開始するには、次のように "echo ["を追加するだけです。

echo Hi!
echo[
echo Hello!

5
名前がファイルが存在する場合、処理が遅く、失敗しますecho[.bat
jeb

何?すぐに動作し、echo [.batファイルを削除するだけです。
PryroTech 2016

2
エコーとまったく同じです。構文。
PryroTech 2016

5
はいecho.、それも悪い解決策です。
ジェブ

1
以前の回答でわかるように、これは最初にパス上のファイルを見つけようとするため、非常に遅くなります。同じことがにも当てはまりますecho.。スクリプトが改行を必要とするからといって、スクリプトのユーザーがシステム上のファイルを削除することを期待するのは、私には良いデザインのようには思えません。
Abel

2

ケンとジェブのソリューションはうまく機能します。

しかし、改行はLF文字のみで生成され、CRLF文字が必要です(Windowsバージョン)。

そのために、スクリプトの最後で、LFをCRLFに変換しました。

例:

TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt

0

@echo(@echo + [space] + [insecable space])を使用できます

注:保護できない領域はAlt + 0160で取得できます

それが役に立てば幸い :)

[編集]そうですね、Makefileで必要でしたが、完全に機能します。私の答えはバッチファイルには適応しないと思います...私の悪い。


私はECHO ist eingeschaltet (ON).空の行を取得しませんでした、cmdプロンプトで試行しました
jeb

1
これは改行ではなく、改行しないスペースです。
Ry-

0

このソリューションは機能します(テスト済み):

type nul | more /e /p

これにより、分離された改行が復帰改行の組み合わせに変換されます。


しかし、これはどのようにテキストの間に改行を追加するのでしょうか?問題は約ですecho hello \n world
ジェブ

私から反対投票。これは質問に対する回答ではありません
Mesalcode

-2

私はそれをもっと簡単にすることはできません:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.