Javascript 是否从批处理文件中缓存的cscript退出值?

Javascript 是否从批处理文件中缓存的cscript退出值?,javascript,batch-file,wsh,Javascript,Batch File,Wsh,我需要启动一些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: %Errorleve

我需要启动一些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

因此,每个循环迭代都会回显相同的数字,但当您重新运行批处理文件时,它会发生变化。我希望它在每次迭代中都会改变。我缺少什么?

在批处理脚本中,行或行块(括号中的行)首先被解析,然后被执行,过程继续到下一行/行块。在解析阶段,在开始执行之前,从代码中删除所有变量读取,并替换为变量中的值

这意味着,如果在块内某个变量的值发生更改,则无法检索该更改的值,因为没有读取操作来检索该变量中的值

在您的情况下,有两个选项:使用延迟扩展或更改errorlevel检查语法

启用延迟扩展后,您可以将变量访问sintax从
%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 (
       ....
    )
)

在这种情况下,必须从较高的值到较低的值检查errorlevel,因为对于任何大于或等于
n

的值,如果errorlevel n
为真,则测试将为真-谢谢。一个简单的解决方案和一个很好的解释。干杯