Es stellt sich heraus, dass for … does "gierig" ist. (Ich erinnere mich nicht, dass ich das vorher gewusst habe, und es scheint nicht prominent dokumentiert zu sein for /?.)
Folgendes meine ich:
Betrachten Sie Skript cow1.bat:
@echo off
for %%a in (how now brown) do echo %%a
echo cow
Ziemlich trivial. Beim Ausführen wird ausgegeben
how
now
brown
cow
wie wir vermuten könnten.
Betrachten Sie Skript cow2.bat:
@echo off
for %%a in (how now brown) do echo %%a & echo cow
Das Gleiche, mit Ausnahme der Zeilen 2 und 3, die durch a getrennt sind &. Erraten Sie, was!? Beim Ausführen wird ausgegeben
how
cow
now
cow
brown
cow
Es wird so interpretiert, als ob es wäre
@echo off
for %%a in (how now brown) do (echo %%a & echo cow)
(Der Wechsel &zu &&hatte keine Wirkung.) In einer (für mich) größeren Überraschung,
@echo off
for %%a in (how now brown) do (echo %%a) & echo cow
auch funktioniert genauso wie cow2. Ich musste verwenden
@echo off
(for %%a in (how now brown) do echo %%a) & echo cow
um das Original zu erhalten, cow1Verhalten.
Wie wirkt sich das auf das OP aus?
for %%F in (*) do move "%%F" "..\%%~nxD - %%F" >nul && popd && rd /s /q "%%D"
ist analog zu cow2: Wenn %%D(das Verzeichnis, in das wir gerade pushdgegangen sind) beatles, dann tut das obige Codesegment dies:
move "george" "..\beatles - george" >nul && popd && rd /s /q "beatles"
move "john" "..\beatles - john" >nul && popd && rd /s /q "beatles"
move "paul" "..\beatles - paul" >nul && popd && rd /s /q "beatles"
move "ringo" "..\beatles - ringo" >nul && popd && rd /s /q "beatles"
(Leerzeichen zur Verdeutlichung hinzugefügt). So bewegt es die erste Datei ( george) und dann popd‚ing aus dem beatlesVerzeichnis und löscht es, die anderen Dateien zu verlassen durch die roomba geerntet werden.
Empfehlung (TL; DR)
Versuchen
for / f "eol =: delims =" %% D in ('dir / b / s / ad * ^ | sort / r') do (pushd "%% D" && ( für %% F in (*) do verschiebe "%% F" ".. \ %% ~ nxD - %% F"> nul ) && popd && rd / s / q "%% D")
↑ ↑
Triviale Frage:
Warum brauchen wir das *im dir /b /s /ad *Unterbefehl?
&&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.