Ich versuche, eine Möglichkeit zu finden, Befehle auf mehrere Dateien anzuwenden, die in mehreren Ordnern vorhanden sind. Soweit ich weiß, for
ist eine Schleife die beste Möglichkeit, dies in CMD zu tun (ich verwende Windows). Ich stoße jedoch auf einige Probleme und werde einen der Vorgänge, die ich ausführen muss, als Beispiel verwenden.
Für diesen speziellen Befehl versuche ich, Ordner für mehrere Dateien innerhalb mehrerer Ordner zu erstellen. Hier ist eine visuelle Darstellung:
Folder A
File 1.avi
File 2.avi
Folder B
File 3.avi
File 4.avi
Ich habe ein wenig gesucht und bin auf diesen Befehl gestoßen:
for /f "delims=*" %a in ('dir *.avi /b /s') do md "%~na"
Die ich zusammengekratzt habe ausHier. Das ist fast richtig – es erstellt einen Ordner für jede Datei, die in den mehreren Ordnern enthalten ist. Das Problem ist, dass diese neuen Ordner in denselben Ordnern wie die Dateien enthalten sein müssen. Dieser spezielle Befehl würde die neuen Ordner an die Stelle der ursprünglichen Ordner setzen und nicht in sie hinein.
Hat jemand eine Idee? Ich bin für jede Hilfe dankbar. Danke.
Antwort1
echo
Eine Standard-Debugging-Technik besteht darin, den Befehl in Skripte und sogar zusammengesetzte/komplexe Befehle einzufügen . Wenn Sie dies tunfor /f "delims=*" %a in ('dir *.avi /b /s') do @echo md "%~na"
Sie erhalten die Ausgabe
"file 1" "file 2" "file 3" "file 4"
Anmerkungen:
- Der
@
verhindert dieecho
Befehlesichvon der Anzeige ausgeschlossen, sodass Sie nur deren Ausgabe sehen. "delims=…"
gibt anfor
, wie die Ausgabezeilen desdir *.avi /b /s
Befehls analysiert werden. Ich weiß nicht, warum die Antwort, auf die Sie verlinkt haben, vorschlägt,"delims=*"
dass Zeilen durch Leerzeichen getrennt werden. Wenn Ihre Verzeichnis- und/oder Dateinamen also Leerzeichen enthalten (wie Sie angegeben haben), sollten Sie verwenden"delims="
(und angeben, dass keine Trennzeichen vorhanden sind), damit dies funktioniert.
- Der
Wenn Sie
for /?
oder eingebenhelp for
, erhalten Sie die Dokumentation zumfor
Befehl. Unten auf der fünften Seite finden SieIn addition, substitution of FOR variable references has been enhanced. You can now use the following optional syntax: %~I - expands %I removing any surrounding quotes (") ︙ %~pI - expands %I to a path only %~nI - expands %I to a file name only ︙ The modifiers can be combined to get compound results … ︙
Das erklärt, warum
%~na
Sie nur den Dateinamen der*.avi
Dateien erhalten, deren vollständige Namen in sind%a
. Versuchen Sie nunfor /f "delims=" %a in ('dir *.avi /b /s') do @echo md "%~pa"
und du bekommst
"das_aktuelle_Verzeichnis\Ordner A\" "das_aktuelle_Verzeichnis\Ordner A\" "das_aktuelle_Verzeichnis\Ordner B\" "das_aktuelle_Verzeichnis\Ordner B\"
Daraus können wir schließen, dass Sie
for /f "delims=" %a in ('dir *.avi /b /s') do md "%~pa%~na"
um die Verzeichnisse
file 1
und unter sowie die Verzeichnisse und unter zu erstellen . Und wie @dave_thompson_085 anmerkt, können Sie zu kombinieren .file 2
Folder A
file 3
file 4
Folder B
%~pa%~na
%~pna