35

'!'を含む文字列を出力する必要があるバッチファイルを書いています。別のファイルに。しかし、その文字列を別のファイルにエコーすると、「!」が削除されます。出力から。

例:入力:

set LINE=Hi this is! output
echo !LINE!>>new_file.txt

new_file.txtの出力は次のとおりです。

Hi this is output

また、入力が

set LINE=Hello!! this is output!!
echo !LINE!>>new_file.txt

new_file.txtでの出力:

Hello

したがって、!をスキップします。(感嘆符)出力からnew_fileへ。%LINE%を使用すると、出力ファイルに「echoison」と表示されます。

この問題を解決する方法を提案してください。

4

2 に答える 2

22

拡張の遅延を有効にしていて感嘆符を出力する場合は、感嘆符をエスケープする必要があります。

感嘆符のエスケープには、配置に応じて、キャレットが1つまたは2つ必要ありません。

@echo off
REM No escaping required, if delayed expansion is disabled
set test1=Test1!

setlocal EnableDelayedExpansion
REM One caret required
REM Delayed expansion uses carets independent of quotes to escape the exclamation mark
set "test2=Test2^!"

REM Two carets required
REM The first caret escapes the second caret in phase2 of the parser
REM Later in the delayed expansion phase, the remaining caret escapes the exclamation mark
set test3=Test3^^!


echo !test1!
echo !test2!
echo !test3!

!var!ブロックとブロックの違いはDOSバッチ%var%で説明されています:なぜ私のsetコマンドは何も保存されないのですか?

バッチパーサーの説明は、Windowsコマンドインタープリター(CMD.EXE)がスクリプトをどのように解析するかを参照してください。

于 2013-01-16T09:46:06.387 に答える
7

SETLOCAL EnableDelayedExpansionコードのどこか高いところに電話をかけたようです。ここを見て、その効果を確認してください。

于 2013-01-16T09:04:39.007 に答える