我一直试图使用MOD(%%)为了使每25个循环的超时/ t 3命令 我得到一个错误“无效操作数” 代码是:批处理 - 在FOR循环中使用模 - 错误操作数
set /a var1=0
FOR /R "folder" %%G in (.) DO (
Pushd %%G
set /a b=%%var1%% %% 25
IF %%b%% EQU 0 (
timeout /t 3
)
set /a var1=%%var1%%+1
Popd
)
我一直试图使用MOD(%%)为了使每25个循环的超时/ t 3命令 我得到一个错误“无效操作数” 代码是:批处理 - 在FOR循环中使用模 - 错误操作数
set /a var1=0
FOR /R "folder" %%G in (.) DO (
Pushd %%G
set /a b=%%var1%% %% 25
IF %%b%% EQU 0 (
timeout /t 3
)
set /a var1=%%var1%%+1
Popd
)
为什么你在成对的%
符号中包含变量名?读取变量的通常语法是%var1%
。
set /A
即使没有百分号左右也可以读取变量,所以请使用set /a b=var1 %% 25
。
其他set /A
命令行可以更改为set /A var1+=1
。
有一个在你的代码,即b
一个有问题的变量,因为你写和相同的代码(parenthesised)块中读它,所以%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
的膨胀(读)时,禁止,因为在情况下,它包含惊叹号标记,否则他们会迷路。
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
)
偷偷摸摸!我爱你的答案,因为我总是学到新的东西。 – DavidPostill
谢谢!奇迹般有效。 –
此外,我已经删除了循环和循环之外的一些代码,因为个人原因,所以这就是为什么你没有看到我的代码的目的:) –
嗯,我设法摆脱无效的操作数,但我似乎无法得到模运算符的工作 –
你只需要'%VAR1%',不'%% VAR1 %%'。 – SomethingDark
@SomethingDark,一般来说你是对的,但是这里需要延迟扩展(至少对'!b!')... – aschipfl