Windows-Batch: Mehr als einen Befehl in einer FOR-Schleife aufrufen?

124

Ist es in Windows-Batchdateien möglich, mehr als einen Befehl in einer einzigen FOR Schleife aufzurufen ? Angenommen, ich möchte den Dateinamen drucken und nach dem Löschen:

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

Ich weiß, dass ich es in diesem Fall lösen könnte, indem ich zwei verschiedene FOR-Schleifen mache: eine zum Anzeigen des Namens und eine zum Löschen der Datei, aber ist es möglich, dies nur in einer Schleife zu tun?

Marco Demaio
quelle

Antworten:

117
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)
SilverSkin
quelle
2
Eigentlich denke ich, dass die Klammern unnötig sind. for %i in (1 2 3) do echo %i & echo foodruckt, was ich erwarten würde: "1", "foo", "2", "foo", "3", "foo" (in separaten Zeilen).
bk1e
Sollte das nicht &&eher sein als &?
JWW
9
@jww &&schlägt fehl, wenn der erste Befehl fehlschlägt, &führt den zweiten Befehl trotzdem aus .
Yyny
Wenn diese Lösung einen Syntaxfehler für Sie verursacht, überprüfen Sie, ob zwischen den DO-parens ein nicht entkoppelter Paren vorhanden ist. Sie können ihnen entkommen, indem Sie ihnen ein anhängen ^.
28онстантин Ван
199

Die Verwendung &ist für kurze Befehle in Ordnung, aber diese einzelne Zeile kann sehr schnell sehr lang werden. Wechseln Sie in diesem Fall zur mehrzeiligen Syntax.

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

Platzierung (und )Angelegenheiten. Die runden Klammern danach DOmüssen in derselben Zeile stehen, sonst ist die Batchdatei falsch.

Siehe if /?|find /V ""für Details.

Anders
quelle
12
Diese Lösung sieht sauber und lesbar aus. Ich würde auch jeden Programmierer, der diese Lösung verwendet, warnen, dass die runde Klammer nach der DONICHT in die nächste Zeile gesetzt werden darf, da sie sonst die Batch-Datei bremst. Wenn ich im Code eine for-Schleife schreibe, setze ich normalerweise die geschweifte Klammer in die {nächste Zeile.
Marco Demaio
2
Seien Sie auch vorsichtig, wenn in einem Ihrer verschachtelten Befehle Klammern stehen (z. B. "echo etwas etwas (etwas anderes)". BEARBEITEN: ah, siehe die Antwort von bk1e :)
Tim Barrass
31

SilverSkin und Anders sind beide richtig. 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. cmdsucht gierig nach der ersten schließenden Klammer, anstatt verschachtelte Sätze von Klammern ordnungsgemäß zu behandeln. Dies kann dazu führen, dass der Rest der Befehlszeile nicht analysiert werden kann, oder dass einige der Klammern an die Befehle übergeben werden (z DEL myfile.txt). B. ).

Eine Problemumgehung besteht darin, den Körper der Schleife in eine separate Funktion aufzuteilen. Beachten Sie, dass Sie wahrscheinlich um den Funktionskörper herum springen müssen, um ein "Durchfallen" zu vermeiden.

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
bk1e
quelle
3
Während wir uns mit dem Thema befassen, ist% X im Umgang mit Dateinamen niemals korrekt. Verwenden Sie immer "% ~ X" (In Ihrem Beispiel hier könnten Sie wahrscheinlich mit% * in der Unterfunktion davonkommen)
Anders
1
Das ist ein wirklich guter Punkt. Ein gutes Beispiel für einen Pfad, der beide Probleme demonstriert, ist C:\Program Files (x86).
bk1e