中易网

批处理里到处都在说setlocal,setlocal有啥用?

答案:1  悬赏:70  
解决时间 2021-01-17 19:49
  • 提问者网友:骨子里的高雅
  • 2021-01-17 11:07
批处理里到处都在说setlocal,setlocal有啥用?
最佳答案
  • 二级知识专家网友:从此江山别
  • 2021-01-17 12:11
开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。
SETLOCAL
如果命令扩展被启用,SETLOCAL 会如下改变:
SETLOCAL 批命令现在可以接受可选参数:
ENABLEEXTENSIONS / DISABLEEXTENSIONS
启用或禁用命令处理器扩展。这些参数比 CMD /E:ON 或 /E:OFF 开关有优先权。请参阅 CMD /? 获取详细信息。
ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
启用或禁用延缓环境变量扩展。这些参数比 CMD /V:ON 或 /V:OFF 开关有优先权。请参阅 CMD /? 获取详细信息。
无论在 SETLOCAL 命令之前它们的设置是什么,这些修改会一直保留到匹配的 ENDLOCAL 命令。
如果有一个参数,
SETLOCAL 命令将设置 ERRORLEVEL 的值。如果有两个有效参数中的一个,该值则为零。
用下列技巧,您可以在批脚本中使用这个来决定扩展是否可用:
VERIFY OTHER 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions
这个方法之所以有效,是因为在 CMD.EXE 的旧版本上,SETLOCAL 未设置 ERRORLEVEL 值。具有不正确参数的 VERIFY 命令将 ERRORLEVEL 值初始化成非零值。
追问:也就是说,setlocal后,对本地文件的修改,全部会在endlocal后失效?
追答:不是说本地文件。

简单点说就是,在for一些命令循环操作中进行set变量设置,如果不开启环境变量延迟功能,那些set的变量都会失效。

用两个示例演示一下

未开启环境变量延迟
@echo off
for /l %%a in (1,1,10) do (
set /a Num+=2
echo %Num%
)
pause

开启环境变量延迟
@echo off
setlocal enabledelayedexpansion
for /l %%a in (1,1,10) do (
set /a Num+=2
echo !Num!
)
pause

两个执行一下,看看有什么不同。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息