作者LPH66 (IWH68S0XZ8M89)
看板Programming
标题Re: [问题] Dos AutoBatch
时间Fri Feb 1 17:18:19 2008
直接贴上set /?里面的范例好了:
---
延迟环境变数展开功能可用来避开展开功能限制。这项限制是发生在命令列
读取过程,不是发生在执行过程。下面的范例说明了立即展开变数时会发生
的问题:
set VAR=before
if "%VAR%" == "before" (
set VAR=after;
if "%VAR%" == "after" @echo If you see this, it worked
)
这个例子永远无法显示 echo 讯息,因为在两个 IF 叙述中的 %VAR% 会
在第一个 IF 叙述被读入时便被展开。这是因为它是逻辑上包含了 IF 的内
部,而内部又是一个复合叙述。 所以在复合叙述内的 IF 实际上是用
"before" 和 "after" 来比较,而这永远不会为真。同样的,下面的例子也
不会作用:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
这个例子中并不会建立目前目录中所有档案的清单,相反的只会将 LIST 变
数设为最後一个找到的档案。同样地,这是因为 %LIST% 只有在 FOR 叙述
第一次被读入时才展开,此时 LIST 变数是空的。所以我们实际执行的 FO
回圈是:
for %i in (*) do set LIST= %i
这只是重复的将 LIST 设为最後找到的档案。
延迟环境变数展开让您可以用一个不同的字元 (惊叹号) 在执行时展开
环境变数。如果启用了延迟环境变数展开,上面的例子可以被改写如下
而正常作用:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
---
简单说 你在一个指令里用这种变数时
所有该展开的%...%是会一次展开的
那如果要让它能够在用到时才展开
那就用!...!来取用
你的for是一整条指令 所以在其中就需要用!...!来展开
就变成 set /a sum = !sum! + 1
不过这得要有启用"延迟环境变数展开"功能才行
这可以用setlocal enabledelayedexpansion来设定
(详见setlocal /?)
记得最後要endlocal还原
--
'You've sort of made up for it tonight,' said Harry. 'Getting the
sword. Finishing the Horcrux. Saving my life.'
'That makes me sound a lot cooler then I was,' Ron mumbled.
'Stuff like that always sounds cooler then it really was,' said
Harry. 'I've been trying to tell you that for years.'
-- Harry Potter and the Deathly Hollows, P.308
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.84.44.21