どのようにしてバッチファイル出力から改行を挿入できますか?
私は次のようなことをしたいです:
echo hello\nworld
どちらが出力されます:
hello
world
echo Yes&echo No
どのようにしてバッチファイル出力から改行を挿入できますか?
私は次のようなことをしたいです:
echo hello\nworld
どちらが出力されます:
hello
world
echo Yes&echo No
回答:
echo hello & echo.world
これは& echo.
、改行の定数として定義できることを意味します\n
。
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
使用する:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
複数のエコーを使用してMakefileを生成していますが、機能しません
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
そしてecho line 2 >> Makefile
。を使用する>>
と、出力がファイルに追加されます。これは、この場合に必要な動作です。
ここで、次の内容を含む.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ステートメントの間のコードだけが必要です。
set nl=^&echo.
、echo hello %nl% world
同じ効果が得られます。
echo:
cmd / bat-filesには空白行を書き込む標準機能があり、cmd-outputの新しい行をエミュレートします。
@echo off
@echo line1
@echo:
@echo line2
上記のcmd-fileの出力:
line1
line2
echo(
です。問題を引き起こす可能性があるように見えますが、実際には完全に機能します。他のすべての形式には、コマンドが期待どおりに実行されない状況が少なくとも1つあります。
ECHO(
失敗したシナリオを考え出したことがありません。
echo
とその効果は何か?」
ケンの答えと同じですが、遅延拡張を使用します。
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:
避けてください。
call :pause line1!\n!line2
サブルーチンを開始しsetlocal EnableDelayedExpansion
て終了しsetlocal DisableDelayedExpansion
ます。
echo,
echo;
echo(
echo/
echo+
echo=
とローグギャラリーの+1 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
値に。
^
次のシンボルを無効にします。
&
同じ行で別のコマンドを実行することを意味します。エラーレベル(大声で叫ぶためのエコーステートメント)は気にしないので、&&
必要あり。
echo.
エコーステートメントを続行します。
コードである変数を実際に作成し、他のコマンド内でそれらを使用できるため、これらすべてが機能します。バッチはまさにシェルスクリプト言語の最も高度なものではないため、これはゲットー関数のようなものです。これが機能するのは、バッチの変数の使用が不十分であり、int、char、float、stringなどを自然に指定しないためです。
あなたが狡猾であるならば、あなたはこれを他のもので機能させることができます。たとえば、それを使用してタブをエコーする
set t=^&echo. ::there are spaces up to the double colon
echo.
最初にその名前でファイルを検索しようとするため、使用しないでください。次のような他の句読点を使用しますecho,
エコーしてファイルにリダイレクトする場合、複数のエコーコマンドは機能しません。多分「>>」リダイレクタが良い選択だと思います:
こんにちはこんにちは> temp エコーワールド>>温度
(echo hello && echo world) > temp
Nathan J. Brauerが(現在の)承認された回答作品へのコメントで言及しました。
Grimtronが示唆するように、これを定義する簡単な例を次に示します。
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
echo hello %newline%world
行を繰り返す場合、間にスペースはありません。
echo "Hello %newline% world"
引用符の中にあるため失敗します。それは本当の改行ではないからです。
このようにすることもできます
(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)
変数に渡すことができる文字列リテラルで有名な\ 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
バックスラッシュを追加しても、スクリプトによる部分文字列の解析が妨げられないことに注意してください。
これは私にとってはうまくいきました、遅延拡張は必要ありません:
@echo off
(
echo ^<html^>
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause
次のような出力を書き込みます。
<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
echo asdf >myfile.txt
はまったく同じ結果を生成します。 echo
文字列の最後に改行を追加します。
新しい行をバッチで開始するには、次のように "echo ["を追加するだけです。
echo Hi!
echo[
echo Hello!
echo[.bat
echo.
、それも悪い解決策です。
echo.
。スクリプトが改行を必要とするからといって、スクリプトのユーザーがシステム上のファイルを削除することを期待するのは、私には良いデザインのようには思えません。