Datei kopieren mit .bat?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.


Jugsy 
Beitragsersteller
 30.08.2024, 16:12

Hat fast zu 100% funktioniert. Wie kopiert der Befehl nur die 1234.mkv Dateien

AntiVegetarier1  30.08.2024, 16:15
@Jugsy

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"
Jugsy 
Beitragsersteller
 30.08.2024, 16:27
@Jugsy
REM Suchmuster für die Dateien
set "filePattern=1234*.mkv"

so gehts
Jugsy 
Beitragsersteller
 30.08.2024, 16:38
@Jugsy

leider funktioniert der Befehl nicht.

wobei bereits kopierte Dateien nicht ein zweites Mal kopiert werden sollen (auch wenn sie vom Zielordner gelöscht wurden)

Es werden immer alle Dateien.mkv neu kopiert

AntiVegetarier1  30.08.2024, 17:14
@Jugsy

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".

Jugsy 
Beitragsersteller
 30.08.2024, 18:58
@AntiVegetarier1

# 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."

   }

}

Jugsy 
Beitragsersteller
 30.08.2024, 18:59
@Jugsy

Es wird nur eine leere .txt Datei im Zielordner erstellt. Etwas ist noch falsch

Jugsy 
Beitragsersteller
 30.08.2024, 15:55

Recht herzlichen Dank

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.


norbertk62  30.08.2024, 15:36

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.