Frage

Ich habe identische Dateien in vier Ordnern (mit den Namen „1“, „2“, „3“, „4“) und möchte diese Dateien in einen einzigen Ordner kopieren, wobei der ursprüngliche Ordnername an den Dateinamen angehängt wird.

Z.B.In jedem Ordner sollte eine Datei mit dem Namen „data.txt“ in einen neuen zusammengeführten Ordner kopiert werden, mit Dateinamen wie „data 1.txt“, „data 2.txt“ usw.

Hier ist, was ich bisher habe, aber ich habe Batch-Scripting nie offiziell gelernt (und kann keine anständigen Tutorials finden – Empfehlungen bitte?) und schaffe es anscheinend nicht, es zum Laufen zu bringen.Hoffentlich gibt das eine Vorstellung davon, was ich erreichen möchte.

DIR="$( dirname "$0" )" && pwd )" // I don't understand this but was told it's 
                                  // necessary to set the working directory as 
                                  // the current folder? Is that correct?
md "consolidated files"
for %%i in ("1","2","3","4") do
    copy *.txt '../consolidated files/"*"+%%i.txt'

Irgendwelche Tipps für Anfänger?Danke!

War es hilfreich?

Lösung

@ECHO OFF
SETLOCAL
PUSHD "U:\sourcedir"
MD "consolidated files" 2>nul
for %%i in ("1","2","3","4") DO (
 FOR /f "delims=" %%m IN ('dir /b /a-d ".\%%~i\*.txt"') DO (
  copy ".\%%~i\%%m" ".\consolidated files\%%~nm %%~i%%~xm"
 )
)
popd
GOTO :EOF

Ihr Versuch zu setzen dir scheint ein zu sein bash Befehl – ​​nützlich unter *nix, aber nicht gut unter CMD.

Im Wesentlichen können Sie das aktuelle Verzeichnis mit festlegen cd

cd "c:\your\desired directory"

Kurioserweise sind die Zitate darin besondere Befehl sind eigentlich unnötig (richten aber keinen Schaden an, also habe ich sie eingefügt.)

Ein anderer Ansatz ist

pushd "c:\your\desired directory"
rem commands following have current directory "c:\your\desired directory"
rem
popd
rem current directory reestored to value before the "pushd"

Ich habe den zweiten Ansatz im obigen Skript verwendet, um vorübergehend zu meinem Testverzeichnis zu wechseln U:\sourcedir

Beachten Sie, dass cmd Verwendet \ als Verzeichnistrennzeichen und / als Schaltanzeige.

Der md Der Befehl ist so, wie Sie ihn hatten.Das Verzeichnis wird relativ zum aktuellen Verzeichnis erstellt, es sei denn, der Pfad wird angegeben (z. B md "C:\somewhere new"). The2>nulsuppresses theDie Meldung „Verzeichnis existiert bereits“ sollte lauten, dass das Verzeichnis bereits existiert.

in einem for...do Anweisung muss sich entweder die Zieloperation in derselben Zeile wie die befinden do oder der do muss befolgt werden Raum( und dann jede Anweisung bis eine Übereinstimmung vorliegt ) wird als zusammengesetzte Anweisung ausgeführt.

Der for..%%i Die Anweisung weist die Werte zu "1".."4" (einschließlich der Anführungszeichen) zu %%i Die Anführungszeichen sind in diesem Fall eigentlich nicht erforderlich, sondern lediglich brauchen muss vorhanden sein, wenn die erforderliche Zeichenfolge a enthält Raum (oder ein anderes Trennzeichen.)

Den nächsten Befehl versteht man am besten von der Mitte aus.Der dir Der Befehl sucht in „.\%%~i\“ nach Dateien mit dem Namen *.txt. ~i bedeutet „Anführungszeichen aus %%i entfernen“.Der /b Der Schalter zeigt nur Dateinamen an – keine Größe, kein Datum oder Kopf-/Fußzeile.Der /a-d Schalter sagt „keine Verzeichnisse“.

Das dir Der Befehl steht in einfachen Anführungszeichen. FOR /f ...('single-quoted command')... Verarbeitet das Ergebnis des Befehls Zeile für Zeile, als wäre es eine Datei.Der "delims=" unterdrückt die standardmäßige Tokenisierung der gefundenen Zeichenfolgen, sodass insgesamt die von der gefundenen Dateinamen dir zugeordnet sind %%m in ihrer Gesamtheit.

Der dann ausgeführte Befehl ist der copy, Kopieren von ".\%%~i\%%m" (d. h.das aktuelle Verzeichnis++das Unterverzeichnis(-quotes)++Dateiname;alle Anführungszeichen im Falle von Leerzeichen) bis ".\consolidated files\%%~nm %%~i%%~xm" (d. h.das aktuelle Verzeichnis+\konsolidierte Dateien+der Namensteil des Dateinamens (%%~nm)+Raum+das Unterverzeichnis (-quotes)+der Erweiterungsteil des Dateinamens (%%~xm))

Beachten Sie, dass + ist ein gültiges Dateinamenzeichen (wie es ist). ') und dass Saiten einfach dadurch aufgebaut werden, dass man sie aneinander stößt.

In Ihrer ursprünglichen Frage hieß es, dass der Name des Quellverzeichnisses nach einem Leerzeichen angehängt werden sollte, daher habe ich das Leerzeichen eingefügt.

Beachten Sie, dass copy werde melden 1 file(s) copied nach jeder Kopie.Sie können dies durch Hinzufügen unterdrücken >nul bis zum Ende des copy Stellungnahme.

Zum Testen würde ich wechseln copy Zu echo copy Dadurch wird der generierte Befehl angezeigt, aber nicht ausgeführt.Leider, wenn Sie das haben >nul an Ort und Stelle, die echo des Befehls wird unterdrückt...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top