我一直試圖使用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