2016-08-02 49 views
0

我一直试图使用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 
) 
+0

嗯,我设法摆脱无效的操作数,但我似乎无法得到模运算符的工作 –

+0

你只需要'%VAR1%',不'%% VAR1 %%'。 – SomethingDark

+0

@SomethingDark,一般来说你是对的,但是这里需要延迟扩展(至少对'!b!')... – aschipfl

回答

1

为什么你在成对的%符号中包含变量名?读取变量的通常语法是%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 
) 

在这里,我放置setlocalendlocal环路的内部,使得延迟扩展的for循环变量%%G的膨胀(读)时,禁止,因为在情况下,它包含惊叹号标记,否则他们会迷路。

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 
) 
+0

偷偷摸摸!我爱你的答案,因为我总是学到新的东西。 – DavidPostill

+0

谢谢!奇迹般有效。 –

+0

此外,我已经删除了循环和循环之外的一些代码,因为个人原因,所以这就是为什么你没有看到我的代码的目的:) –