
Hallo, ich habe folgendes Problem
Angenommen, Sie haben eine Windows-Ordnerstruktur mit verschiedenen Dateien (alle Dateien haben unterschiedliche Namen, können aber die gleiche Erweiterung haben):
dirA
subDirA
file1.png
file2.dds
file3.jpeg
dirB
subDirB
subSubDirB
file4.tiff
some_txt.txt
test.cfg
final.docx
Und nun kopierst du alle Dateien rekursiv in ein anderes Verzeichnis:
file1.png
file2.dds
file3.jpeg
file4.tiff
some_txt.txt
test.cfg
final.docx
Und jetzt möchte ich alle diese Dateien zurück in ihre ursprünglichen Ordner kopieren (beachten Sie, dass die vorherigen Ordner und Dateien noch da sind, ich habe sie nur kopiert) und die vorherigen Dateien überschreiben. In Wirklichkeit sind es sehr viele Dateien, daher ist es keine Option, sie manuell zu bearbeiten.
Gibt es eine einfache Möglichkeit, dies zu tun, oder sollte ich hierfür besser ein benutzerdefiniertes Programm/Skript schreiben?
Antwort1
Normalerweise würde ich für so etwas eine Batch-Lösung bevorzugen:
@echo off
set "orig=C:\Original\Directory"
set "dir=C:\Some\Directory"
for /r "%orig%" %%A in (*) do (
if exist "%dir%\%%~nxA" copy /y "%dir%\%%~nxA" "%%A"
)
Die orig
Variable ist der oberste Ordner, den Sie rekursiv durchlaufen möchten (d. h. dirA
oder dirB
aus Ihrem Beispielblock – oder wenn sie einen Ordner gemeinsam nutzen, können Sie so hoch gehen, wie Sie möchten, solange Sie sicher sind, dass es keine doppelten Namen gibt). Die dir
Variable ist der Ordner, in den Sie zuvor alle Dateien kopiert haben.
for /r
Schleifen durchalleDateien, die in einem Verzeichnis verwurzelt sind (also orig
alle seine Unterordner); für jede Iteration setzt es den vollständigen Pfad und die Erweiterung der Datei als %%A
, dann prüfen wir innerhalb der Schleife, ob %%~nxA
(die Datei, reduziert auf ihren Namen und ihre Erweiterung) an unserem dir
Speicherort existiert; wenn sie existiert, kopieren wir diese Datei von dir
über sich selbst an den orig
Speicherort. Das ist alles. Wenn Sie zur Überprüfung eine Protokolldatei erstellen möchten, empfehle ich normalerweise die Verwendung von robocopy und lasse alles aus der Schleife in eine Textdatei ausgeben, die wie folgt aussehen würde:
@echo off
set "orig=C:\Original\Directory"
set "dir=C:\Some\Directory"
setlocal enabledelayedexpansion
for /r "%orig%" %%A in (*) do (
set "path=%%~dpA"
if exist "%dir%\%%~nxA" robocopy "%dir%" "!path:~0,-1!" "%%~nxA"
)>>"%dir%\Return Files.txt"
Der einzige knifflige Unterschied besteht darin, die verzögerte Erweiterung zu aktivieren, sodass Sie das Nachkomma abschneiden \
können %%~dpA
.
Antwort2
Was Sie tun möchten, ist unmöglich: Die Dateien an ihrem neuen Speicherort enthalten nicht mehr die Information, woher sie stammen. Das bedeutet, dass ein Skript nicht wissen kann, wo es jede Datei ablegen soll.
Wenn Sie über einen alten Verzeichniseintrag verfügen, lässt sich dies problemlos mit einer Skriptsprache erledigen.
Antwort3
Wenn Sie garantieren, dass es keine Namensduplikate gibt, verwenden Sie etwas wie
forfiles /P X:\originals_folder /S /C "cmd /c copy Y:\copies_folder\@file @path\@file /Y"
Antwort4
Eine PowerShell-Lösung, die eine Hashtabelle zum Nachschlagen von Pfaden verwendet:
$originals = 'c:\originals'
$copies = 'c:\copies'
$hash = @{}
gci $originals -recurse | %{
$hash[$_.name] = $_.Fullname
}
gci $copies | %{copy-item $_ $hash[$_.Name] -force