批处理问题: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。用户特定设置比机器设置有优先权。命令行开关比注册表设置有优先权。
如果延迟环境变量扩展被启用,惊叹号字符可在执行时间,被用来代替一个环境变量的数值。
比如在下面的代码中:
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。用户特定设置比机器设置有优先权。命令行开关比注册表设置有优先权。
如果延迟环境变量扩展被启用,惊叹号字符可在执行时间,被用来代替一个环境变量的数值。
相关文章推荐
- “SET 命令设置的环境变量在 FOR 循环中始终为空”问题的原因与解决方法
- 批处理命令set的一个小问题:设置变量名与变量值只差一个文件扩展名
- 一天一篇批处理之——Part5: 跟变量/参数有关的高频命令set,shift,for
- 问题(已解决):push pop for循环中push变量,变量随之改变的问题
- java 和 c等作用域问题,循环中重复定义变量
- 批处理中的变量与命令set的用法
- 通过自执行函数解决,for循环变量泄漏的问题
- keil中for循环变量递减,无法跳出循环的问题
- Linux下env、export、echo和set命令的用法与区别(Linux环境变量的设置)
- set、env、export――Linux中的环境变量命令
- set、env、export——Linux中的环境变量命令
- PostgreSQL环境变量与psql命令的替代作用
- window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
- dos命令失效了怎么办?找回丢失的环境变量
- 查看环境变量的命令:运行-cmd-set
- 批处理命令 For循环命令具体解释!
- LInux下环境变量配置错误导致不能登录的及命令失效解决方案
- win10 1703配置java环境变量,解决javac不是内部或外部命令等问题
- 批处理命令 For循环命令详解!
- windows 10 配置jdk环境变量遇到 javac或者jar 不是内部或外部命令问题