2010-02-12 3 views
90

Ist es in Windows Batch-Datei möglich, mehr als einen Befehl in einer einzigenFOR Schleife aufzurufen? Nehmen wir zum Beispiel sagen, ich will den Dateinamen drucken und nach löschen:Windows-Stapel: mehr als einen Befehl in einer FOR-Schleife aufrufen?

@ECHO OFF 
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X) 
REM the line above is invalid syntax. 

ich in diesem Fall weiß ich, es FOR-Schleifen verschieden, indem Sie zwei lösen könnte: eine für den Namen zeigt und eine für das Löschen der Datei , aber ist es möglich, dies nur in einer Schleife zu tun?

Antwort

85
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X) 
+1

Eigentlich denke ich, die Klammern sind nicht notwendig. 'für% i in (1 2 3) echo% i & echo foo 'druckt was ich erwarten würde:" 1 "," foo "," 2 "," foo "," 3 "," foo "(auf separate Zeilen). – bk1e

+0

Sollte das nicht '&&' anstatt '&' sein? – jww

+6

@jww '&&' wird fehlschlagen, wenn der erste Befehl fehlschlägt, '&' wird den zweiten Befehl trotzdem ausführen. – YoYoYonnY

156

& Verwendung ist für kurze Befehle in Ordnung, aber das einzige Zeile kann sehr lange sehr schnell bekommen. Wenn das passiert, wechseln Sie zu mehrzeiliger Syntax.

FOR /r %%X IN (*.txt) DO (
    ECHO %%X 
    DEL %%X 
) 

Platzierung von ( und ) Angelegenheiten. Die runden Klammern nach DO müssen in derselben Zeile stehen, sonst wird die Batch-Datei falsch sein.

Weitere Informationen finden Sie unter if /?|find /V "".

+11

Diese Lösung sieht sauber und lesbar aus. Ich würde auch jeden Programmierer warnen, der diese Lösung verwendet, dass die runde Klammer nach dem "DO" NICHT in die nächste Zeile gesetzt werden darf, da sonst die Batch-Datei abgebremst wird. Im Code, wenn ich eine for-Schleife schreibe, lege ich normalerweise die geschweifte Klammer '{' nächste Zeile. –

+2

Auch - seien Sie vorsichtig, wenn einer Ihrer verschachtelten Befehle Klammern haben (zum Beispiel etwas wie "echo etwas etwas (etwas anderes)" EDIT: ah, siehe bk1e's Antwort :) –

27

SilverSkin und Anders sind beide korrekt. Sie können Klammern verwenden, um mehrere Befehle auszuführen. Sie müssen jedoch sicherstellen, dass die Befehle selbst (und ihre Parameter) keine Klammern enthalten. cmd sucht gierig nach der ersten schließenden Klammer, anstatt verschachtelte Klammern sinnvoll zu behandeln. Dies kann dazu führen, dass der Rest der Befehlszeile nicht analysiert wird, oder einige der Klammern an die Befehle übergeben werden (z. B. DEL myfile.txt)).

Eine Problemumgehung dafür ist, den Körper der Schleife in eine separate Funktion aufzuteilen. Beachten Sie, dass Sie wahrscheinlich um den Funktionskörper herumspringen müssen, um zu vermeiden, dass er "hineinfällt".

FOR /r %%X IN (*.txt) DO CALL :loopbody %%X 
REM Don't "fall through" to :loopbody. 
GOTO :EOF 

:loopbody 
ECHO %1 
DEL %1 
GOTO :EOF 
+1

Während wir zum Thema sind, ist% X niemals korrigieren, wenn es um Dateinamen geht, benutze immer "% ~ X" (In deinem Beispiel könntest du% * in der Unterfunktion wahrscheinlich verwenden) – Anders

+1

Das ist ein wirklich guter Punkt. Ein gutes Beispiel für einen Pfad, der beide Probleme zeigt, ist 'C: \ Programme (x86)'. – bk1e

Verwandte Themen