Difference between %variable% and !variable! in ba

2019-01-22 12:17发布

I am writing a batch file where I need to output a string containing '!' to another file. But when I echo that string to another file, it removes "!" from the output.

Eg: Input:

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

Output in new_file.txt is:

Hi this is output

Also, if input is

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

Output in new_file.txt:

Hello

Hence, it skips the ! (Exclamation mark) from the output to the new_file. If I use %LINE%, then it simply displays "echo is on" to the output file.

Please suggest a way to overcome this problem.

2条回答
ら.Afraid
2楼-- · 2019-01-22 12:53

It seems you have called SETLOCAL EnableDelayedExpansion somewhere higher in the code. Take a look here to see what the effects from that are.

查看更多
迷人小祖宗
3楼-- · 2019-01-22 13:06

If you have delayed expansion enabled and want to output an exclamation mark, you need to escape it.

Escaping of exclamation marks needs none, one or two carets, depending on the placement.

@echo off
set test1=Test1!
setlocal EnableDelayedExpansion
set test2=Test2^^!
set "test3=Test3^!"

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

The difference between !var! and %var% in blocks is explained at DOS batch: Why are my set commands resulting in nothing getting stored?

An explanation of the batch parser can be found at How does the Windows Command Interpreter (CMD.EXE) parse scripts?

查看更多
登录 后发表回答