我一直在尝试使用MOD(%%)来每25个循环发出一次超时/ t 3命令 我收到错误“无效操作数” 代码是:
(n,x)
答案 0 :(得分:2)
aschipfl has identified the problem and provided a fix。但只有一个SET / A语句,有一种非常简洁有效的方法来实现您的目标,而不会有任何延迟扩展。
您可以在一个SET / A中组合多个计算和分配。您甚至可以在更大的表达式中使用赋值表达式的结果。
您可以通过故意除以零来避免IF语句。当模数结果为0时,除法失败,并且通过将stderr重定向到nul来隐藏任何错误消息。条件||
命令连接运算符仅在前面的命令失败时触发,在这种情况下除以0。
我不了解你的循环的目的 - 这似乎毫无意义。但是正确的暂停引入了以下内容:
set /a var1=0
for /r "folder" %%G in (.) do (
pushd "%%~G"
set /a "1/((var1+=1) %% 25)" 2>nul || timeout /t 3
popd
)
答案 1 :(得分:1)
为什么要将变量名称括在%
个符号对中?读取变量的常用语法是%var1%
。
set /A
也可以读取变量,因此请使用set /a b=var1 %% 25
另一个set /A
命令行可以更改为set /A var1+=1
。
您的代码中有一个有问题的变量,即b
,因为您正在编写和在同一个(带括号的)代码块中读取它,因此%b%
是在整个for
循环被解析时读取,此时它最可能是空的
对于这种情况,您需要应用delayed expansion,因此在执行时读取变量。要启用它,请使用setlocal
命令;要实际使用它,请写!b!
而不是%b%
。
这是固定代码:
set /A var1=0
for /R "folder" %%G in (.) do (
pushd "%%~G"
set /A b=var1 %% 25
setlocal EnableDelayedExpansion
if !b! EQU 0 (
timeout /T 3
)
endlocal
set /A var1+=1
popd
)
这里我将setlocal
和endlocal
放在循环中,以便在扩展(读取)for
循环变量%%G
期间禁用延迟扩展,因为如果它包含惊叹号,否则会丢失。