バッチファイル出力から改行をどのように挿入できますか?
私は何かをしたいのですが。
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文の間にコードがあれば十分です。
Cmd/bat-filesには、空白行を書き込むための標準機能echo:
があります。これは、cmd出力に新しい行をエミュレートするものです。
@echo off
@echo line1
@echo:
@echo line2
上記のcmd-fileの出力:
line1
line2
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:
の使用は避けてください。
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
ファイルにリダイレクトするために何かをエコーするとき、複数のエコーコマンドは機能しません。私は多分 ">>"リダイレクタが良い選択だと思います:
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.
エラーメッセージが表示されます。
これが少なくとも一人の他の人を助けることを願っています:)
次のように、新しい行をバッチで開始するには、 "echo ["を追加するだけです。
echo Hi!
echo[
echo Hello!
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
(
echo ^<html^>
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause
それはこのように出力を書く:
<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
変数に渡すことができる文字列リテラルで有名な\ 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を使用します。そして実行は\ nをnewlineの内容に置き換えます(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
バックスラッシュを追加してもスクリプトが部分文字列を解析するのを妨げることはありません。
あなたは@echo
を使うことができます(@echo + [space] + [insecable space])
注:手に負えないスペースはAlt + 0160で得ることができます
それが役に立てば幸い :)
[編集]うーん、そうですね、私はそれをMakefileで必要としました、それはそこで完全に働きます。私の答えはバッチファイルには適していないと思います。