当前位置:主页>Windows 专区> 正文
批处理问题:SET 命令在 FOR 循环中失效 / SET 环境变量生存域/作用域
-
我在 FOR 循环中用 SET 为一个环境变量赋值,结果发现该变量始终为空内容,不知何故
比如在下面的代码中:
1、第一个 for 语句我是打算取得 YYMMDD 格式的日期,在 for 语句内部的 SET TODAY_FOLDER 语句得不到 TODAY 的值,然而如果放在 for 语句后面就可以
2、第二、第三两个嵌套 for 语句我打算得到一组 IP 地址,然而 echo 用户端IP是%THE_CLIENT_IP% 得到的仍然是空的
代码:
@echo off
FOR /F "tokens=1-3 delims=- " %%i IN ('date /t') DO (
SET TODAY=%%i%%j%%k
SET TODAY_FOLDER=%TODAY:~2%
)
REM 如果
REM SET TODAY_FOLDER=%TODAY:~2%
REM IP 段:15?-18?,其中 ? 取值范围 [1-9](因每排只有 9 个)
for /L %%i in (5,1,8) do (
for /L %%j in (1,1,9) do (
SET THE_CLIENT_IP=192.168.115.1%%i%%j
echo %ERRORLEVEL% ClientIP=[%THE_CLIENT_IP%] 192.168.115.1%%i%%j
)
)
REM endlocal
@echo on
第二行这样写
FOR /F " usebackq tokens=1-3 delims=- " %%i IN (`date/t`) DO (
echo %ERRORLEVEL% ClientIP=[%THE_CLIENT_IP%] 192.168.115.1%%i%%j 字串8
改为:
cmd /v:on /c echo %ERRORLEVEL% ClientIP=[!THE_CLIENT_IP!] 192.168.115.1%%i%%j
cmd /v
@echo off
FOR /F "tokens=1-3 delims=- " %%i IN ('date /t') DO (
SET TODAY=%%i%%j%%k
echo !TODAY!
SET TODAY_FOLDER=!TODAY:~2!
echo !TODAY_FOLDER!
)
说白了就是启用/v
/V:ON 将 ! 作为定界符启动延缓环境变量扩展。如: /V:ON 会
允许 !var! 在执行时允许 !var! 扩展变量 var。var 语法
在输入时扩展变量,这与在一个 FOR 循环内不同。
谢谢两位的提示,遇到这个问题有点意外。
/*
启用延迟的环境变量扩展
如果启用延迟的环境变量扩展,则可以使用感叹号字符来替代运行时的环境变量值。
*/
总结:
该问题起因于未启用 cmd.exe 的 /V:ON 选项,/V:ON 选项将禁用环境变量的延缓生效
如果不加该选项(cmd.exe 默认),则环境变量在诸如 if、for 语句体内的值不会实时的取得
相关文档:
1、C:\>help cmd
2、
(WindowsXP cmd) http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/cmd.mspx?mfr=true 字串4
(Windows2000 Command Processor FAQ) http://www.microsoft.com/technet/prodtechnol/Windows2000serv/support/FAQW2KCP.mspx
(WindowsServer2003 cmd)
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/zh-chs/library/ServerHelp/d0518719-7154-49b4-954c-0a6c015ab441.mspx?mfr=true
3、(本帖) http://community.csdn.net/Expert/topic/4661/4661135.xml?temp=.9362757




