我需要启动一些javascript并将结果返回到一个批处理文件中。我正在使用cscript命令来这样做。它在批处理文件的每次运行中都可以正常工作,但是如果我将对cscript的调用放在一个循环中,则返回值似乎在批处理文件运行时被缓存。下面是问题的本质:
demo.bat:
@echo off
for /l %%i in (1, 1, 5) do (
cscript /nologo /e:jscript "demo.js" %%i
echo %%i returned: %Errorlevel%
)
demo.js:
WSH.Quit(Math.floor(Math.random() * 100));
产出:
C:\temp>demo.bat
1 returned 9
2 returned 9
3 returned 9
4 returned 9
5 returned 9
C:\temp>demo.bat
1 returned 55
2 returned 55
3 returned 55
4 returned 55
5 returned 55
因此,每个循环迭代都会重复相同的数字,但是当您重新运行批处理文件时,它确实会发生变化。我希望它在每次迭代中都会改变。我遗漏了什么?
发布于 2014-10-24 10:16:06
在批处理脚本中,行或行块(括在括号内的行)首先被解析,然后执行,然后进程继续到下一行/块。在解析阶段,所有变量读取都会从代码中删除,并在开始执行之前替换为变量中的值。
这意味着,如果在块内变量的值被更改,则由于没有读取操作来检索变量中的值,因此无法检索该更改的值。
在您的示例中,您有两个选项:使用延迟展开或更改错误级别检查语法。
启用延迟扩展后,您可以将变量访问新税从%var%
更改为!var!
,向解析器指示变量扩展(对变量中值的访问)必须延迟到执行阶段。
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1, 1, 5) do (
cscript /nologo /e:jscript "demo.js" %%i
echo %%i returned: !Errorlevel!
)
另一个选项是使用语法if errorlevel x ...
。对于返回随机值的代码示例不是很有用,但是对于已知的一组值,它应该是
@echo off
for /l %%i in (1, 1, 5) do (
cscript /nologo /e:jscript "demo.js" %%i
if error level 10 (
....
) else if errorlevel 9 (
.....
)
if errorlevel 8 ....
....
if not errorlevel 1 (
....
)
)
在这种情况下,必须从较高的值到较低的值检查错误级别,因为对于任何大于或等于n
的值,测试的n
都是真的。
https://stackoverflow.com/questions/26545338
复制相似问题