开发者

DOS batch: SET variable and ECHO it within (...) block

I had a problem with set not working in a batch file; it took a while to distil the problem; at first I thought it was to do with subroutine calls...

The script

@echo off
setlocal
set a=aaa
echo a = "%a%"
(
set b=bbb
echo b = "%b%"
)

produces the output

a = "aaa"
b = ""

whereas I'd expect

a = "aaa"
b = "bbb"

Why is this please? Is it a bug in开发者_StackOverflow社区 DOS? Perhaps there's something about the (...) command grouping syntax that I'm unaware of.

Thanks.


User delayed expansion and ! instead of %

@echo off
setlocal enableextensions enabledelayedexpansion
set a=aaa
echo a = "%a%"
(
set b=bbb
echo b = "!b!"
)


What's happening is that the batch interpreter as treating everything in between the brackets a single line. This means it's doing variable replacement on everything betweeen the brackets before any of the commands are run.

So:

(
set b=bbb
echo b = "%b%"
)

Becomes:

(
set b=bbb
echo b = ""
)

The variable b is being set but obviously isn't set before you run the SET command.


You need delayed expansion to be on, or the batch interpreter will interpolate all variables at parsing time, instead of run time.

setlocal enableextensions enabledelayedexpansion

See this question for an example and some great explanation of it.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜