作为其他的答案中所提到的,问题是由嵌套括号引起的。
而是避免他们,你也可以通过前^
字符逃脱他们 - 这工作:
IF EXIST MyFile.txt (ECHO Some^(More^)Potatoes)
没有插入符^
这里,命令行解释采取第一)
关闭第一(
。
然而,应用上述逃逸技术原来的问题的代码避免了错误信息,但不不结果在工作脚本,即使内SET
由SET /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%
;这个使用标准的立即扩大...
然而,由于minval
和maxval
是在脚本中的常量是最聪明的一次仅做FOR
计算maxval-minval+1
外,像@KenWhite建议。
按照你的建议,我改变了我的'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
代'意想不到%MAXVAL%'和'%MINVAL%'表达式使用其数值摆脱错误...所以我想这个问题必须与一些扩展百分比的属性? – 2015-02-24 19:03:29
我明白了。它是嵌套的括号对。我将编辑以包含修复程序。 – 2015-02-24 19:27:49