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

StackOverflow https://stackoverflow.com/questions/132799

  •  02-07-2019
  •  | 
  •  

質問

バッチファイルの出力から改行を挿入するにはどうすればよいでしょうか?

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

echo hello\nworld

これは次のように出力します:

hello
world
役に立ちましたか?

解決

echo hello & echo.world

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

他のヒント

使用:

echo hello
echo.
echo world

さあ、次の内容を含む .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 ステートメント間のコードのみが必要です。

標準機能があります echo: cmd/bat ファイルに空行を書き込むと、cmd 出力の新しい行がエミュレートされます。

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

上記の cmd ファイルの出力:

line1

line2

Ken の答えと似ていますが、遅延拡張を使用しています。

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

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

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

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

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

編集:避ける echo.

質問はシングルに関するものなので、これでは質問には答えられません echo 複数行出力できるもの。

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

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

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

しかし、 echo., echo\ または echo: ネットワーク ドライブなど、スクリプトが実行される場所によっては非常に遅くなる可能性があるため、避ける必要があります。

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 に等しい:

^ 続く次の記号を無効にします。

& 同じ行で別のコマンドを実行することを意味します。errorlevel (大声で叫ぶための echo ステートメント) は気にしないので、いいえ && が必要です。

echo. echo ステートメントを続けます。

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

賢い人なら、これを他のものにも応用できるかもしれません。たとえば、タブをエコーするために使用します。

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

何かをエコーし​​てファイルにリダイレクトする場合、複数の echo コマンドは機能しません。おそらく ">>" リダイレクターが良い選択だと思います。

echo hello > temp
echo world >> temp

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

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

出力

C:\>test.bat
hello
world

結果をファイルに保存する必要がある場合は、次のように使用できます。

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

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

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

MINGW make メイクファイルから空行をエコーし​​たい人がここに来たら、私は次のようにしました。

@cmd /c echo.

単に使用して echo. 恐ろしいことを引き起こす process_begin: CreateProcess(NULL, echo., ...) failed. エラーメッセージ。

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

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

echo Hi!
echo[
echo Hello!

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

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

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

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

Ken と Jeb のソリューションはうまく機能します。

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

これに対して、スクリプトの最後で LF を CRLF に変換しました。

例:

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

変数に渡すことができる文字列リテラルで有名な を使用する必要がある場合は、次のようなコードを書くことができます。 こんにちは。バット 以下のスクリプト:

@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 つの場所 (他のスクリプトまたは外部ファイルであっても) で準備し、別の場所で印刷できます。

改行は保持されます 改行 変数。その値を置き換える必要があります エコー 行が拡張されたので使用します setlocalenableDelayedExpansion 実行時に変数を展開する感嘆符を有効にします。そして処刑の代行者は 改行 内容 (構文は次の場所で探してください) ヘルプセット)。もちろん使用することもできます !改行! を設定しながら 答え しかし のほうが便利です。外部から渡される可能性があります(試してください) こんにちは R2 D2)、改行を保持する変数の名前は誰も知りません (はい、 こんにちは C3!改行!P0 同じように動作します)。

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

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


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

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

使用できます @echo ( @echo + [スペース] + [分離不可能なスペース] )

注記:切断不可能な空間は Alt+0160 で取得できます

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

[編集] うーん、おっしゃるとおりです。Makefile でそれが必要でした。そこでは完全に動作します。私の答えはバッチファイルに適応していないと思います...悪いです。

これ以上簡単にすることはできません:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat

Linux システムでこれを実現するための最も保守的な方法は、 -e エイリアス - バックスラッシュで囲まれたエスケープ文字を解釈します。

echo -e "hello\nworld"

その他はこちら

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top