web-dev-qa-db-ja.com

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

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

私は何かをしたいのですが。

echo hello\nworld

どれが出力されます:

hello
world
571
Brian R. Bondy

echo hello & echo.world

つまり、& echo.を改行\nの定数として定義できます。

425
Grimtron

つかいます:

echo hello
echo.
echo world
504
Matt Lacey

ここでは、次の内容で.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文の間にコードがあれば十分です。

126
Ken

Cmd/bat-filesには、空白行を書き込むための標準機能echo:があります。これは、cmd出力に新しい行をエミュレートするものです。

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

上記のcmd-fileの出力:

line1

line2
93
macropas

Kenの答えに似ていますが、遅延展開を使用しています。

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

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

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

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

もっと説明があります
SO:Vista/DOSバッチ(.bat)ファイルで長いコマンドが複数行に分割される
SO:WindowsのCommand Interpreter(CMD.EXE)はスクリプトをどのように解析するのですか。

編集:echo.を避ける

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

しかし、echo.を使用して新しい行を作成することを提案する他の回答にもかかわらず、cmd.exeがECHOという名前のファイルを検索して次のように試みるので、echo.は最悪です。始めよう。

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

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

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

59
jeb

echo.十分に言った。

単一行で必要な場合は、&を使用してください。例えば、

echo Line 1 & echo. & echo line 3

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

Line 1

line 3

さて、あなたが何かもっとちょっと派手なものが欲しいと言って...

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

アウトプット

hello
world

それから、echoステートメントに新しい行が欲しいときはいつでも%n%を投げるだけです。これは、さまざまな言語で使用されている\nにより近いものです。

壊す

set n=は、変数nを次の値に設定します。

^フォローする次のシンボルを空白にします。

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

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

あなたが実際にコードである変数を作成して、他のコマンドの中でそれらを使用することができるので、これのすべては働きます。バッチはまさに最先端のシェルスクリプト言語ではないため、これは一種のゲットー関数のようなものです。これは、バッチでは変数の使用法が悪く、整数、文字、浮動小数点数、文字列などの間を自然に指定しないためにのみ機能します。

あなたが巧妙であれば、あなたはこれを他のものと一緒に機能させることができます。たとえば、タブをエコーするためにそれを使用する

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

ファイルにリダイレクトするために何かをエコーするとき、複数のエコーコマンドは機能しません。私は多分 ">>"リダイレクタが良い選択だと思います:

 echo hello> temp 
 echo world >> temp 
19
Crend King

Grimtronが示唆しているのと同じように、これを定義するための簡単な例を示します。

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

出力

C:\>test.bat
hello
world
15
user287293

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

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

あなたもこんなことができます、

(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)
9
albert

誰かがMINGWのmakeファイルから空白行をエコーし​​ようとしているためにここに来たのなら、私が使った

@cmd /c echo.

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

これが少なくとも一人の他の人を助けることを願っています:)

6
Wayne Uroda

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

echo Hi!
echo[
echo Hello!
3
PryroTech

KenとJebのソリューションはうまくいきます。

しかし、新しい行はLF文字だけで生成され、CRLF文字が必要です(Windows版)。

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

例:

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

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

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

それはこのように出力を書く:

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

変数に渡すことができる文字列リテラルで有名な\ 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!%

このようにして、複数行の出力は、他の断片ファイルや外部ファイルでも、ある場所で作成され、別の場所で印刷されることがあります。

改行はnewline変数に保持されます。その値を代入する必要がありますafterecho行が展開されるので、実行時に変数を展開する感嘆符を有効にするにはsetlocal enableDelayedExpansionを使用します。そして実行は\ nnewlineの内容に置き換えます(help setで構文を探してください)。もちろん!改行を使えます!answerに設定しながら\ 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

バックスラッシュを追加してもスクリプトが部分文字列を解析するのを妨げることはありません。

2
Tomator

あなたは@echoを使うことができます(@echo + [space] + [insecable space])

注:手に負えないスペースはAlt + 0160で得ることができます

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

[編集]うーん、そうですね、私はそれをMakefileで必要としました、それはそこで完全に働きます。私の答えはバッチファイルには適していないと思います。

0
johan d.