首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从批处理文件中缓存的cscript退出值?

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

Stack Overflow用户
提问于 2014-10-24 09:37:11
回答 1查看 1.5K关注 0票数 0

我需要启动一些javascript并将结果返回到一个批处理文件中。我正在使用cscript命令来这样做。它在批处理文件的每次运行中都可以正常工作,但是如果我将对cscript的调用放在一个循环中,则返回值似乎在批处理文件运行时被缓存。下面是问题的本质:

demo.bat:

代码语言:javascript
运行
复制
@echo off
for /l %%i in (1, 1, 5) do (
    cscript /nologo /e:jscript "demo.js" %%i
    echo %%i returned: %Errorlevel%
)

demo.js:

代码语言:javascript
运行
复制
WSH.Quit(Math.floor(Math.random() * 100));

产出:

代码语言:javascript
运行
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-24 10:16:06

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

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

在您的示例中,您有两个选项:使用延迟展开或更改错误级别检查语法。

启用延迟扩展后,您可以将变量访问新税从%var%更改为!var!,向解析器指示变量扩展(对变量中值的访问)必须延迟到执行阶段。

代码语言:javascript
运行
复制
@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 ...。对于返回随机值的代码示例不是很有用,但是对于已知的一组值,它应该是

代码语言:javascript
运行
复制
@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都是真的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26545338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档