Datei kopieren mit .bat?
Ich möchte aus unterschiedlichen Ordnern, alle neuen Dateien mit dem Namen 1234 in einen anderen Ordner kopieren, wobei bereits kopierte Dateien nicht ein zweites Mal kopiert werden sollen (auch wenn sie vom Zielordner gelöscht wurden)
3 Antworten
schonmal chatgpt gefragt?
Du:
Batch-Datei: Ich möchte aus unterschiedlichen Ordnern, alle neuen Dateien mit dem Namen 1234 in einen anderen Ordner kopieren, wobei bereits kopierte Dateien nicht ein zweites Mal kopiert werden sollen (auch wenn sie vom Zielordner gelöscht wurden)
ChatGPT:
Um dies in einer Batch-Datei umzusetzen, kannst du eine Kombination aus xcopy und einem Tracking-Mechanismus verwenden. Dabei wird eine Liste aller bereits kopierten Dateien geführt, sodass nur neue Dateien kopiert werden.
Hier ist ein Beispiel für eine Batch-Datei, die dies umsetzt:
batch
@echo off
setlocal
REM Zielordner festlegen
set "targetDir=C:\Pfad\zum\Zielordner"
REM Liste der bereits kopierten Dateien
set "logFile=C:\Pfad\zum\Zielordner\copied_files.log"
REM Suchmuster für die Dateien
set "filePattern=1234*"
REM Wurzelordner, in dem gesucht wird
set "rootDir=C:\Pfad\zum\RootOrdner"
REM Sicherstellen, dass die Log-Datei existiert
if not exist "%logFile%" echo. > "%logFile%"
REM Alle Dateien finden und kopieren
for /r "%rootDir%" %%f in (%filePattern%) do (
REM Überprüfen, ob die Datei bereits kopiert wurde
findstr /x /c:"%%~ff" "%logFile%" >nul
if errorlevel 1 (
REM Datei kopieren
echo Kopiere %%~ff nach %targetDir%
xcopy "%%~ff" "%targetDir%" /y /i
if errorlevel 0 (
REM Erfolgreich kopierte Datei in die Log-Datei schreiben
echo %%~ff >> "%logFile%"
)
) else (
echo Datei %%~ff wurde bereits kopiert.
)
)
echo Fertig!
Erklärung:
targetDir: Gibt den Zielordner an, in den die Dateien kopiert werden sollen.
logFile: Diese Datei speichert die Pfade der bereits kopierten Dateien.
filePattern: Das Suchmuster für die Dateien (z. B. 1234* für alle Dateien, die mit 1234 beginnen).
rootDir: Der Wurzelordner, in dem nach den Dateien gesucht wird.
findstr: Überprüft, ob der Pfad der Datei bereits in der Log-Datei existiert.
xcopy: Kopiert die Datei in den Zielordner.
echo %%~ff >> "%logFile%": Fügt den Pfad der erfolgreich kopierten Datei in die Log-Datei ein.
Hinweise:
Ersetze die Pfade (targetDir, logFile, rootDir) und das Suchmuster (filePattern) durch die spezifischen Werte für deinen Anwendungsfall.
Die Log-Datei stellt sicher, dass Dateien, die bereits einmal kopiert wurden, nicht erneut kopiert werden, selbst wenn sie im Zielordner gelöscht wurden.
Diese Batch-Datei kann nun ausgeführt werden, um alle neuen Dateien mit dem Namen 1234 (oder einem anderen Muster) aus den verschiedenen Ordnern in den Zielordner zu kopieren, ohne doppelte Kopien zu erzeugen.
ersetze diesen teil:
REM Suchmuster für die Dateien
set "filePattern=1234*"
durch diesen hier:
REM Suchmuster für die Dateien
set "filePattern=1234.mkv"
du kannst mal dieses powershell skript ausprobieren:
# Quell- und Zielordner definieren
$sourceFolder = "C:\Pfad\Zum\Quellordner"
$destinationFolder = "C:\Pfad\Zum\Zielordner"
# Datei, um bereits kopierte Dateien zu speichern
$logFile = "$destinationFolder\kopierte_dateien.txt"
# Sicherstellen, dass die Log-Datei existiert
if (-not (Test-Path -Path $logFile)) {
New-Item -ItemType File -Path $logFile -Force
}
# Alle Dateien mit dem Muster 1234*.mkv im Quellordner finden
$files = Get-ChildItem -Path $sourceFolder -Filter "1234*.mkv"
# Bereit kopierte Dateien laden
$copiedFiles = Get-Content -Path $logFile
foreach ($file in $files) {
$destinationFile = Join-Path -Path $destinationFolder -ChildPath $file.Name
# Überprüfen, ob die Datei bereits kopiert wurde
if (-not ($copiedFiles -contains $file.Name)) {
# Datei kopieren
Copy-Item -Path $file.FullName -Destination $destinationFile
# Dateinamen zur Log-Datei hinzufügen
Add-Content -Path $logFile -Value $file.Name
Write-Output "Datei $($file.Name) wurde kopiert."
} else {
Write-Output "Datei $($file.Name) wurde bereits kopiert, überspringen."
}
}
nenne die datei nicht .bat sondern .ps1, mach einen rechtsklick darauf und klicke auf "mit powershell ausführen".
# Quell- und Zielordner definieren
$sourceFolder = "E:\"
$destinationFolder = "Z:\Neuer Ordner\GZSZ"
# Datei, um bereits kopierte Dateien zu speichern
$logFile = "$destinationFolder\kopierte_dateien.txt"
# Sicherstellen, dass die Log-Datei existiert
if (-not (Test-Path -Path $logFile)) {
New-Item -ItemType File -Path $logFile -Force
}
# Alle Dateien mit dem Muster GZSZ*.mkv im Quellordner finden
$files = Get-ChildItem -Path $sourceFolder -Filter "GZSZ*.mkv"
# Bereit kopierte Dateien laden
$copiedFiles = Get-Content -Path $logFile
foreach ($file in $files) {
$destinationFile = Join-Path -Path $destinationFolder -ChildPath $file.Name
# Überprüfen, ob die Datei bereits kopiert wurde
if (-not ($copiedFiles -contains $file.Name)) {
# Datei kopieren
Copy-Item -Path $file.FullName -Destination $destinationFile
# Dateinamen zur Log-Datei hinzufügen
Add-Content -Path $logFile -Value $file.Name
Write-Output "Datei $($file.Name) wurde kopiert."
} else {
Write-Output "Datei $($file.Name) wurde bereits kopiert, überspringen."
}
}
Du bist anscheinend auf Win unterwegs - da wäre das Mittel der Wahl der Befehl "robocopy". Der hat aber wirklich eine Riesenliste an Kommandozeilen-Parametern - das musst du erst mal genau für deinen Anwendungszweck raussuchen.
Das mit dem "auch wenn sie vom Zielordner gelöscht wurden" wirst du aber kaum hinbekommen, weil der bei jedem Lauf beide Verzeichnisse neu einliest. Da kenne ich aber auch kein anderes Programm.
Was natürlich funktionieren würde - da müsstest du aber in die Programmierung einsteigen:
- du nimmst PERL (der CMD oder PowerShell dürfte da nicht so gut sein)
- der geht jede der Dateien in <quelle> durch und sucht sie in der <kopierliste> (die du im Programmlauf mitführen musst)
- wenn <datei> noch nicht in <kopierliste>, dann kopieren und in <kopierliste> protokollieren.
- wenn <datei> in <kopierliste> dann nicht kopieren
- So ungefähr.
das entspricht grob der Batchdatei von AntiVegetarier1
Der "auch wenn sie vom Zielordner gelöscht wurden" teil ist relativ komplex umzusetzen. Wenn ich das richtig verstehe, müsste wohl eine datei erstellen die eine liste enthält mit allen datein die mal kopiert wurden.
Hat fast zu 100% funktioniert. Wie kopiert der Befehl nur die 1234.mkv Dateien