Ich versuche, das mehrzeilige Skript zu transformieren
@echo off
for /f "eol=: delims=" %%D in ('dir /b /s /ad *^|sort /r') do (
pushd "%%D"
for %%F in (*) do move "%%F" "..\%%~nxD - %%F" >nul
popd
rd /s /q "%%D"
)
exit
in eine einzelne Zeile, um sie als Kontextmenüeintrag zu registrieren. Nach meinem Verständnis wäre der entsprechende einzeilige Befehl der folgende:
@echo off && for /f "eol=: delims=" %%D in ('dir /b /s /ad *^|sort /r') do (pushd "%%D" && for %%F in (*) do move "%%F" "..\%%~nxD - %%F" >nul && popd && rd /s /q "%%D") && exit
... aber es erzeugt andere Ergebnisse als das ursprüngliche Skript.
Das Ersetzen von && durch & ergibt ein drittes anderes Ergebnis, aber meines Wissens würde ich in diesem Fall trotzdem das && brauchen.
Was könnte ich falsch machen?
windows
command-line
batch
Jesús Cruz
quelle
quelle
&&
bedeutet aber , dass der Befehl nur ausgeführt wird, wenn der vorherige erfolgreich war. Es könnte Züge geben, die in der inneren Schleife scheitern? Sie können nur&
die Befehle aneinanderreihen.DO
Teils der FOR-Schleife nicht glücklich ist, durch getrennt zu werden&&
. Auch das Eröffnungsecho aus und die abschließenden Exit-Anweisungen sind wahrscheinlich nicht erforderlich.Antworten:
Es stellt sich heraus, dass
for … do
es "gierig" ist. (Ich erinnere mich nicht, dass ich das vorher gewusst habe, und es scheint nicht prominent dokumentiert zu seinfor /?
.)Folgendes meine ich:
Betrachten Sie Skript
cow1.bat
:Ziemlich trivial. Beim Ausführen wird ausgegeben
wie wir vermuten könnten.
Betrachten Sie Skript
cow2.bat
:Das Gleiche, mit Ausnahme der Zeilen 2 und 3, die durch a getrennt sind
&
. Erraten Sie, was!? Beim Ausführen wird ausgegebenEs wird so interpretiert, als ob es wäre
(Der Wechsel
&
zu&&
hatte keine Wirkung.) In einer (für mich) größeren Überraschung,auch funktioniert genauso wie
cow2
. Ich musste verwendenum das Original zu erhalten,
cow1
Verhalten.Wie wirkt sich das auf das OP aus?
ist analog zu
cow2
: Wenn%%D
(das Verzeichnis, in das wir geradepushd
gegangen sind)beatles
, dann tut das obige Codesegment dies:(Leerzeichen zur Verdeutlichung hinzugefügt). So bewegt es die erste Datei (
george
) und dannpopd
‚ing aus dembeatles
Verzeichnis und löscht es, die anderen Dateien zu verlassen durch die roomba geerntet werden.Empfehlung (TL; DR)
Versuchen
Triviale Frage:
Warum brauchen wir das
*
imdir /b /s /ad *
Unterbefehl?quelle
*
imdir /b /s /ad *
Unterbefehl?" Das tust du nicht.dir /b /s /ad *
unddir /b /s /ad
zu verschiedenen Zeiten an verschiedenen Orten, Situationen und Kontexten. Wenn sie immer die gleiche Ausgabe produzieren, können Sie sicher sein, dass David und ich Recht haben und dass sie gleichwertig sind. Wenn Sie fett sind, können Sie die überflüssigen zwei Zeichen aus Ihrem Skript löschen. Wenn Sie jedoch jemals unterschiedliche Ausgaben von den beiden Befehlen erhalten, kehren Sie bitte hierher zurück und lassen Sie es uns wissen, denn dann haben Sie uns etwas beigebracht.