2016-08-02 48 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

此外,我已經刪除了循環和循環之外的一些代碼,因爲個人原因,所以這就是爲什麼你沒有看到我的代碼的目的:) –