Wie führe ich Befehle für Dateien in mehreren Ordnern aus?

Wie führe ich Befehle für Dateien in mehreren Ordnern aus?

Ich versuche, eine Möglichkeit zu finden, Befehle auf mehrere Dateien anzuwenden, die in mehreren Ordnern vorhanden sind. Soweit ich weiß, forist 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

  1. echoEine Standard-Debugging-Technik besteht darin, den Befehl in Skripte und sogar zusammengesetzte/komplexe Befehle einzufügen . Wenn Sie dies tun

    for /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 die echoBefehlesichvon der Anzeige ausgeschlossen, sodass Sie nur deren Ausgabe sehen.
    • "delims=…"gibt an for , wie die Ausgabezeilen des dir *.avi /b /sBefehls 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.
  2. Wenn Sie for /?oder eingeben help for, erhalten Sie die Dokumentation zum forBefehl. Unten auf der fünften Seite finden Sie

    In 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 %~naSie nur den Dateinamen der *.aviDateien erhalten, deren vollständige Namen in sind %a. Versuchen Sie nun

    for /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 1und unter sowie die Verzeichnisse und unter zu erstellen . Und wie @dave_thompson_085 anmerkt, können Sie zu kombinieren .file 2Folder Afile 3file 4Folder B%~pa%~na%~pna

verwandte Informationen