2016-08-02 37 views
0

Ich habe versucht, MOD (%%) zu verwenden, um ein Timeout/t 3 Befehl alle 25 Schleifen Ich bekomme einen Fehler "ungültiger Operand" Code ist:Batch - Verwenden von Modulo in einer FOR-Schleife - Fehleroperand

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

Nun habe ich es geschafft aus dem ungültigen Operanden zu erhalten, aber ich kann nicht scheinen, um die Modulo-Operator zu erhalten –

+0

arbeiten Sie müssen nur '% var1%', nicht '%% var1 %%'. – SomethingDark

+0

@SomethingDark, im Allgemeinen hast du recht, aber hier ist eine verzögerte Erweiterung erforderlich (zumindest für '! B!') ... – aschipfl

Antwort

1

Warum sind Sie Variablennamen in Paaren von % Zeichen umschließt? Die übliche Syntax zum Lesen einer Variablen lautet %var1%.

set /A können Variablen auch ohne Prozentzeichen lesen, also verwenden Sie set /a b=var1 %% 25.
Die andere set /A Befehlszeile kann in set /A var1+=1 geändert werden.

Es gibt eine problematische Variable in Ihrem Code, nämlich b, weil Sie schreiben und es innerhalb derselben (parenthesised) Codeblock zu lesen, so %b% gelesen wird, wenn die gesamte for Schleife analysiert wird, an welcher Stelle es ist höchstwahrscheinlich leer. Für solche Fälle müssen Sie delayed expansion anwenden, damit die Variable zur Ausführungszeit gelesen wird. Um es zu aktivieren, verwenden Sie den Befehl setlocal; um es tatsächlich zu verwenden, schreiben Sie !b! anstelle von %b%. Hier

ist der Fixcode:

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 
) 

Hier I setlocal und endlocal innerhalb der Schleife angeordnet, so dass eine verzögerte Expansion während der Expansion (Lesen) des for Schleifenvariable %%G, weil im Falle deaktiviert wird Ausrufungs enthält Marken, sie würden sonst verloren gehen.

2

aschipfl has identified the problem and provided a fix. Aber es gibt einen sehr prägnanten und effizienten Weg, um Ihr Ziel ohne verzögerte Erweiterung mit nur einer SET/A-Anweisung zu erreichen.

Sie können mehrere Berechnungen und Zuweisungen innerhalb eines SET/A kombinieren. Sie können das Ergebnis eines Zuweisungsausdrucks sogar in einem noch größeren Ausdruck verwenden.

Sie können eine IF-Anweisung vermeiden, indem Sie sie absichtlich durch Null dividieren. Wenn das Modulo-Ergebnis 0 ist, schlägt die Division fehl, und etwaige Fehlermeldungen werden durch Umleiten von stderr auf null ausgeblendet. Der bedingte Befehlsverkettungsoperator || wird nur ausgelöst, wenn der vorhergehende Befehl fehlschlug, in diesem Fall bei Division durch 0.

Ich verstehe den Zweck Ihrer Schleife nicht - es scheint sinnlos. Aber die richtige Pause wird eingeführt mit den folgenden:

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

Sneaky! Ich liebe deine Antworten, weil ich immer etwas Neues lerne. – DavidPostill

+0

Danke! Klappt wunderbar. –

+0

Außerdem habe ich einige Code zwischen der Schleife und außerhalb der Schleife aus persönlichen Gründen gelöscht, deshalb sehen Sie keinen Zweck für meinen Code :) –