Einfaches Batch-Skript zur Dateikonsolidierung – Anfängerprobleme
-
21-12-2019 - |
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!
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"). The
2>nulsuppresses the
Die 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...