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

时间:2014-10-24 09:37:11

标签: 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: %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

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

1 个答案:

答案 0 :(得分:0)

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

这意味着如果在块内部更改了变量的值,则无法检索此更改的值,因为没有读取操作来检索变量中的值。

在您的情况下,您有两个选择:使用延迟扩展或更改错误级别检查语法

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

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