您没有向我们展示完整的批处理代码,因此我必须猜测变量的原因HTMLPGnr
未根据参考定义。
DelayedExpansion 在变量定义期间打开,在使用变量时关闭。
这句话让我想起您的批处理文件中使用了以下内容:
setlocal EnableDelayedExpansion
if HTMLPGnr==1 set /a HTMLNxtpg=2
if HTMLPGnr==2 set /a HTMLNxtpg=3
if HTMLPGnr==3 set /a HTMLNxtpg=4
if HTMLPGnr==4 set /a HTMLNxtpg=5
if HTMLPGnr==5 set /a HTMLNxtpg=6
if HTMLPGnr==6 set /a HTMLNxtpg=1
endlocal
echo ^<body onload="timer=setTimeout(function(){ window.location='file:///C:/Users/MyUser/Dropbox/Netpage/sources/Page/Page_%HTMLNxtpg%.html';}, %HTMLlen%)" style="background:#408CBD"^>>>sources/Page/Page_%HTMLPGnr%.html
命令setlocal带参数启用延迟扩展不仅启用延迟环境变量扩展,还创建当前环境表的副本。
Every set命令修改新表中的环境变量。之前的环境变量表同时保留在内存中且未修改。因此,更改现有环境变量的值或添加环境变量只能在新表上完成。
命令endlocal恢复以前的延迟扩展模式,这意味着通常将其关闭。此外,当前的环境变量表也将被丢弃,并从内存中恢复以前的表。
So all set导致在之间添加、删除或修改变量的操作setlcoal and endlocal命令后丢失endlocal.
作为变量HTMLNxtpg
在启用延迟扩展和无用选项的新表中创建完全无用的/a
,命令执行后该变量不再存在endlocal.
As Stephan https://stackoverflow.com/users/2152082/stephan建议,这 9 行代码可以替换为以下 2 行:
set /a HTMLNxtpg=HTMLPGnr %% 6 + 1
echo ^<body onload="timer=setTimeout(function(){ window.location='file:///C:/Users/MyUser/Dropbox/Netpage/sources/Page/Page_%HTMLNxtpg%.html';}, %HTMLlen%)" style="background:#408CBD"^>>>sources/Page/Page_%HTMLPGnr%.html
但让我们看看setlocal and endlocal一个简单示例的行为:
@echo off
set "TEST=Hi!"
echo 1. !TEST!
echo 2. %TEST%
setlocal EnableDelayedExpansion
echo 3. !TEST!
echo 4. %TEST%
set "TEST=Hello^!"
echo 5. !TEST!
echo 6. %TEST%
setlocal DisableDelayedExpansion
echo 7. !TEST!
echo 8. %TEST%
set "TEST=Bonjour!"
echo 9. !TEST!
echo 10. %TEST%
endlocal
echo 11. !TEST!
echo 12. %TEST%
endlocal
echo 13. !TEST!
echo 14. %TEST%
set "TEST="
pause
运行此批处理文件会产生以下输出:
1. !TEST!
2. Hi!
3. Hi!
4. Hi
5. Hello!
6. Hello
7. !TEST!
8. Hello!
9. !TEST!
10. Bonjour!
11. Hello!
12. Hello
13. !TEST!
14. Hi!
-
!TEST!
是输出,因为默认情况下未启用延迟环境变量扩展。
-
Hi!
引用变量值的输出是正确的TEST
通常在未启用延迟扩展时。
-
Hi!
现在输出带有变量的引用值TEST
具有延迟扩展,因为现在启用了延迟扩展,并且变量仍然存在,因为之前创建了整个表的副本。
-
Hi
没有解释的标记在变量的引用值上输出TEST
通常是因为感叹号被命令行解释器解释为延迟变量引用的开始。
-
Hello!
修改变量后延迟扩展的正确输出TEST
.
修改需要通过转义感叹号来完成,否则命令行解释器将解释!
再次作为将新字符串分配给变量的延迟扩展变量引用的开始TEST
.
-
Hello
引用新值时输出不带感叹号TEST
通常出于与以前相同的原因。
-
!TEST!
当延迟环境变量扩展再次被禁用时输出。
-
Hello!
是正确的输出TEST
禁用延迟扩展并创建整个环境变量表的另一副本后。
-
!TEST!
输出为延迟环境变量扩展仍然被禁用,尽管值TEST
又被改变了。
-
Bonjour!
是第三个实例的值的正确输出TEST
.
-
Hello!
之后输出endlocal它丢弃了第三个表并恢复了延迟扩展模式。
-
Hello
还表示第二个表的延迟扩展再次处于活动状态,因为感叹号再次不输出。
-
!TEST!
是输出,因为再过一个endlocal第二个表也被丢弃,我们回到初始表,延迟扩展再次被禁用。
-
Hi!
是第一个实例的引用值的最终输出TEST
通常在删除此变量之前。
我希望这个简单的例子有助于理解命令的含义setlocal and endlocal do.