我需要触发一些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
因此,每次循环迭代都会回显相同的数字,但是当您重新运行批处理文件时它会发生变化。我希望它会在每次迭代时发生变化。我错过了什么?
答案 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
都为真