您的位置:首页 > 其它

批处理问题:SET 命令在 FOR 循环中失效 / SET 环境变量生存域/作用域

2008-10-29 18:46 756 查看
我在 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 :on
用help cmd命令得到以下说明:
/V:ON 将 ! 作为定界符启动延缓环境变量扩展。如: /V:ON 会允许 !var! 在执行时允许 !var! 扩展变量 var。var 语法在输入时扩展变量,这与在一个 FOR 循环内不同。

 

延迟环境变量扩展不按默认值启用。您可以用/V:ON 或 /V:OFF开关,为 CMD.EXE 的某个调用而启用或停用延迟环境变量扩展。
您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的延迟扩展,这要通过设置使用 REGEDT.EXE 的注册表中的一个或两个 REG_DWORD 值:

    HKEY_LOCAL_MACHINE/Software/Microsoft/Command Processor/DelayedExpansion

        和/或

    HKEY_CURRENT_USER/Software/Microsoft/Command Processor/DelayedExpansion

到 0x1 或 0x0。用户特定设置比机器设置有优先权。命令行开关比注册表设置有优先权。

如果延迟环境变量扩展被启用,惊叹号字符可在执行时间,被用来代替一个环境变量的数值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  扩展 date cmd