2015-02-24 55 views
0

我写了一个小脚本暂停的每个人之间的随机量来显示文本文件的每一行:批处理脚本错误:“/此时意外。”

SET pauseTime=10 
SET maxval=20 
SET minval=5 
FOR /f %%j in (search1.txt) DO (
    SET pauseTime=%RANDOM% * (%maxval% - %minval% + 1)/32768 + %minval% 
    ECHO.%pauseTime% 
    TIMEOUT %pauseTime% 
    ECHO.%%j 
) 

在cmd.exe的运行这给了我:
C:\用户\ Tim \ Desktop> SET minval = 5
/此时意外。

但是,如果我简单地做:

FOR /f %%j in (search1.txt) DO (
    ECHO.%%j 
) 

我得到印有没有错误

这是怎么回事所有行?

回答

3

您需要将/A开关添加到您的SET语句中以执行数学运算。 (我平时也删除任何嵌入的空格得到它的正常工作为好。)

SET /A pausetime=%RANDOM%*(%maxval%)-%minval%)/32768+%minval% 

你要还造成批量处理器无法正常发放的for表达式中括号(误差数字表达式中的嵌套对)。您可以修复由括号内打破了表达的那部分分离出来,单独的变量,然后使用该变量来代替部分:

SET pauseTime=10 
SET maxval=20 
SET minval=5 
SET /A maxmin=%maxval% - %minval% + 1 
FOR /f %%j in (search1.txt) DO (
    SET /A pauseTime=%RANDOM% * %maxmin%/32768 + %minval% 
    ECHO. %pauseTime% 
    TIMEOUT %pauseTime% 
    ECHO. %j% 
) 
+0

按照你的建议,我改变了我的'SET pauseTime =%RANDOM%*(%MAXVAL% - %MINVAL%+ 1)/ 32768 +%MINVAL%'到'SET/A pauseTime =%RANDOM%*(% MAXVAL% - %MINVAL%)/ 32768 +%MINVAL%'。现在运行该脚本给我:_C:\用户\添\桌面> SET MINVAL = 5 /32768 + 5在此time._ – 2015-02-24 18:52:20

+0

代'意想不到%MAXVAL%'和'%MINVAL%'表达式使用其数值摆脱错误...所以我想这个问题必须与一些扩展百分比的属性? – 2015-02-24 19:03:29

+0

我明白了。它是嵌套的括号对。我将编辑以包含修复程序。 – 2015-02-24 19:27:49

1

这里的问题是因为你使用嵌套()括号该批次无法处理并导致您的问题,您可能需要将您的暂停时间计算分成2行。

see this article

The CMD shell statement does not use any great intelligence when evaluating parenthesis, so for example the command below will fail:

IF EXIST MyFile.txt (ECHO Some(more)Potatoes)

1

作为其他的答案中所提到的,问题是由嵌套括号引起的。

而是避免他们,你也可以通过^字符逃脱他们 - 这工作:

IF EXIST MyFile.txt (ECHO Some^(More^)Potatoes) 

没有插入符^这里,命令行解释采取第一)关闭第一(


然而,应用上述逃逸技术原来的问题的代码避免了错误信息,但不结果在工作脚本,即使内SETSET /a取代(如由所提到@KenWhite),因为你需要建立delayed environment variable expansion;否则,显示的pauseTime值始终是最初的一个,10。下面的修复工作:

@ECHO OFF 
SET pauseTime=10 
SET maxval=20 
SET minval=5 
SETLOCAL EnableDelayedExpansion 
FOR /f %%j in (search1.txt) DO (
    SET /a pauseTime=!RANDOM!*^(maxval-minval+1^)/32768+minval 
    ECHO.!pauseTime! 
    TIMEOUT !pauseTime! 
    ECHO.%%j 
) 
ENDLOCAL 

这里,SETLOCAL声明使FOR命令执行前的延迟扩展。在FOR循环体,%pauseTime%%RANDOM%分别由!pauseTime!!RANDOM!,取代;那些变量会受到延迟扩展的影响(因为包含了!!),这意味着在解析整个FOR命令时,它们不会(像往常一样)立即扩展,但执行时会立即扩展。为便于清晰起见,我除去从其它变量%%SET /a命令由于当/a开关是本它们不是必需的(注意,也支持一个操作者% !!)。

注:此脚本运行后,pauseTime被复位到初始值10作为SETLOCAL/ENDLOCAL块构成新的局部环境的命名空间;如果您需要最后一个值,请将ENDLOCAL替换为ENDLOCAL & SET pauseTime=%pauseTime%;这个使用标准的立即扩大...


然而,由于minvalmaxval是在脚本中的常量是最聪明的一次仅做FOR计算maxval-minval+1外,像@KenWhite建议。