zwergie
Goto Top

Robocopy - nur geänderte Daten kopieren, vorhandene nicht überschreiben, sondern Durchnummerieren

Hallo zusammen,
Ich hab ein Programm gesucht und gefunden das genau zum Titel passt, doch leider funktionierte dieses Skript nicht.
Ich kenne mich mit Programmieren absolut nicht aus und hab experimentell dann letztlich das skript, von SpottyDog Robocopy - mehrere Versionen geänderter Dateien archivieren zum laufen gebracht.

Jetzt meine Frage an euch.

Ist es möglich das so umzuschreiben, das anstatt des Datum-Zeit Stempel eine fortlaufende Nr. kommt.

z b
Text.txt
Text(1).txt
Text(2).txt
u.s.w
Wie gesagt ich hab keinerlei Ahnung von Scripten und wäre sehr Dankbar wenn sich einer die Mühe machen würde, es so zu realisieren.

Content-ID: 6805173670

Url: https://administrator.de/contentid/6805173670

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

techSmile
techSmile 17.04.2023 um 17:16:19 Uhr
Goto Top
YARCGUI kann ich dir da empfehlen - ist mit grafischer Oberfläche und du kannst alles erdenkliche konfigurieren.
Robocopy ist in der hinsicht recht mächtig.

Wenn eine Linuxumgebung zur Verfügung steht, wären die Möglichkeiten mit rsync aber nochmal größer.
Zwergie
Zwergie 17.04.2023 um 22:16:13 Uhr
Goto Top
Hallo techSmile,
Danke für den Typ, für normale Kopiervorgänge ist die Oberfläche richtig gut, vor allem für mich, da ich keinerlei Programierkenntnisse hab. Aber leider für mein vorhaben, soweit ich es beurteilen kann, nicht praktikable.

Schau dir das Script doch mal genauer an, mit dem obigen link.
techSmile
techSmile 17.04.2023 um 22:24:27 Uhr
Goto Top
Zitat von @Zwergie:

Schau dir das Script doch mal genauer an, mit dem obigen link.

Mache ich und gebe nochmal Feedback. Ich meine das ist möglich.
Zwergie
Zwergie 27.04.2023 um 10:12:11 Uhr
Goto Top
Hallo techSmile,
Warscheinlich hattest du keine Zeit es zu testen. Bin dir aber trotzdem dankbar, das du versucht hast mir zu helfen.

Mittlerweile kopiere ich das ganze mit dem Windowsexplorer über 2 Fenstern.
Bei der Abfrage was ich Kopieren möschte, wähle ich "Für jede Datei selber entscheiden" aus und setze ein Haken links unten "Dateien mit gleichem Datum und Größe überspringen".
Oben setze ich den Haken bei "Dateien von" und "Dateien bereits enthalten"
und danach auf weiter.
Somit werden vorhandene, nicht geänderte Dateien auch nicht überschrieben und geänderte durchnummeriert.

Als Batch wäre es natürlich perfekt.
Vielleicht wird es doch noch von einem gelesen der neugierigkeits halber das Skript auf die beine stellt.
techSmile
techSmile 02.05.2023 um 17:44:30 Uhr
Goto Top
Hallo Zwergie,

leider war ich so wie du mit Robocopy bisher erfolglos.
Ich bin aber über xcopy gestolpert und scheinbar gibt es dort diese Funktion mit einem * am Ende der Zeile:


Anbei ein Link, eventuell hilft dir das.
https://www.litigationsupporttipofthenight.com/single-post/2018/05/08/wi ...
Nachfolgend noch die Befehlstabelle von Microsoft:
https://learn.microsoft.com/de-de/windows-server/administration/windows- ...
Zwergie
Zwergie 03.05.2023 um 17:23:58 Uhr
Goto Top
Hallo techSmile,
Danke für deinen versuch, es mit Robocopy hinzubekommen. face-smile
Einzelne Daten mit xcopy oder Robocopy umbenennen, ist kein problem,
der Hinweis mit xcopy:

xcopy C:\FooFolder\music\canseidersexy.txt c:\electroclash\canseidersexy2.txt ist für einzelne Dateien die einfachste Lösung.
Wenn aber hunderte von Dateien im Ordner liegen und nur einige davon geändert werden (ich weis nicht welche das sind), dann ist der obige befehl nicht praktikable.

Dieses Script von PowerShell kopiert z.b. alle Dateien auch die im unterordner, von der Quelle zum Ziel (Leider wird die Ordnerstruktur nicht beibehalten) und bei jedem weiteren vorgang werden alle Dateien kopiert und umbenannt.

Test.txt
Test_1.txt
Test_2.txt
Test_3.txt
u.s.w.

$source = "D:\Quelle"  
$target = "E:\Ziel"  
foreach($file in Get-ChildItem $source -file -filter *.* -recurse){
     $dst = "$target\$($file.Name)"  
     $cnt = 1
     while(Test-Path $dst){
         $dst = "$target\$($file.Basename)_$cnt$($file.Extension)"  
         $cnt++
     }
     $file | Copy-Item -Destination $dst -force -verbose
}


Idealer weise sollte es so sein das der Ordner mit Unterordnern beim ersten mal 1zu1 kopiert wird und bei den nächsten durchläufe erkennt, ob sich Daden geändert haben, wenn ja sollte das Skript nur diese Dateien kopieren umbenennen und die vorhandene nicht überschreiben.
Zwergie
Zwergie 11.05.2023 um 11:21:03 Uhr
Goto Top
Ist wirklich keiner da, der dieses Problem bewerkstelligen kann? face-sad
Muss nicht umbedingt mit Robocopy, sondern kann auch mit PowerShell geschrieben sein.

Ist halt nur wichtig das es wie beschrieben funktioniert.
7010350221
Lösung 7010350221 11.05.2023 aktualisiert um 11:36:55 Uhr
Goto Top
$sourceroot = 'D:\quelle'  
$targetroot = 'E:\ziel'  
$files_source = Get-ChildItem $sourceroot -Recurse -File | select *,@{n='RelativePath';e={$_.Fullname -replace [regex]::Escape($sourceroot)}}  
$files_target = Get-ChildItem $targetroot -Recurse -File | select *,@{n='RelativePath';e={$_.Fullname -replace [regex]::Escape($targetroot)}}  
compare @($files_source) @($files_target) -Property RelativePath,LastWriteTime,Length -passthru | ?{$_.SideIndicator -eq '<='} | %{  
    $dest = join-path $targetroot $_.RelativePath
    $targetfolder = "$targetroot\$([io.path]::GetDirectoryName($_.RelativePath))"  
    if (!(Test-Path $targetfolder)){new-item -type dir $targetfolder -Force | out-null}
    $cnt = 0
    while((Test-Path $dest)){
        $dest = join-path $targetfolder "$($_.Basename)_$("{0:D2}" -f (++$cnt))$($_.Extension)"  
    }
    if($cnt -gt 1){
        if ($_.LastWriteTime -eq (Get-Item (join-path $targetfolder "$($_.Basename)_$("{0:D2}" -f ($cnt-1))$($_.Extension)")).LastWriteTime){  
            return
        }
    }
    $_ | copy-item -Destination $dest -Verbose
}
Gruß
Zwergie
Zwergie 11.05.2023 aktualisiert um 17:07:40 Uhr
Goto Top
Hallo Ultramatic,
Hab's gerade getestet, Ordner werden jetzt mitkopiert, das ist schoma gut.
Wenn man es jetzt so realisieren könnte das nach dem 2. durchlauf neue und die geänderte dateien kopiert und durchnummeriert werden, wäre es perfekt.
Momentan werden alle Dateien bei jedem durchlauf nochmal kopiert und durchnummeriert. Somit hätte ich unmenge Daten die ich nicht bräuchte und wüsste nicht welche Dateien sich geändert haben.
Es ist bestimmt kompliziert das zu realisieren.

Hoffe das ich mich richtig ausgedrückt hab.

Vielen lieben Dank, dachte es würde sich keiner mehr melden und hoffe weiter auf deine Hilfe.

Gruß Zwergie
7010350221
7010350221 11.05.2023 aktualisiert um 17:14:41 Uhr
Goto Top
Zitat von @Zwergie:

Hallo Ultramatic,
Hab's gerade getestet, Ordner werden jetzt mitkopiert, das ist schoma gut.
Wenn man es jetzt so realisieren könnte das nach dem 2. durchlauf neue und geänderte dateien kopiert und durchnummeriert werden, wäre es perfekt.
Ist so schon integriert!
Momentan werden alle Dateien bei jedem durchlauf nochmal kopiert und durchnummeriert. Somit hätte ich unmenge Daten die ich nicht bräuchte und wüsste nicht welche Dateien sich geändert haben.
Dann ist dein Ziel wohl FAT32 statt NTFS denn das hat nur eine 2 Sekunden Auflösung der LastWriteTime Werte dann kommt es zu dem Verhalten weil dann die meisten Zeiten nicht mehr zwischen Quelle und Ziel übereinstimmen funktionierte hier im Test nämlich einwandfrei. Also besser du formatierst die Backup-Platte mit NTFS, schon wegen der max. Dateigröße sicherer.
Zwergie
Zwergie 11.05.2023 um 19:40:29 Uhr
Goto Top
Wow hätte nie gadacht das es mit Fat 32 zu tun hatt.
Ultramatic ich weis nicht wie ich dir danken soll.......... einfach Super
Funktioniert Tadellos .
Danke, Danke, Danke...

Wünsche dir ein schönes Wochenende...
Zwergie
Zwergie 12.05.2023 um 14:46:34 Uhr
Goto Top
Hab diese Zeile am schluss eingefügt
Get-ChildItem $targetfolder -Filter *_0*.* | select Name
und sehe die ausgabe nur im Powershell IES.
wenn ich es über das Powershell Skript starte, sehe ich keine ausgabe, auch nicht mit der pause am Schluss.

Besser wäre es wenn in der ausgabe die kopierten Dateien erscheinen würden.
7010350221
7010350221 12.05.2023 um 16:46:54 Uhr
Goto Top
Macht das Skript schon in Zeile 18 mit dem -verbose Parameter.
Zwergie
Zwergie 12.05.2023 um 20:27:31 Uhr
Goto Top
ja habs gesehen, dachte nur das man mit dem obigen Befehl,
das ganze etwas überichtlicher machen könnte.

Dir nochmals vielen Dank, mir geholfen zu haben.
Zwergie
Zwergie 14.05.2023 um 11:09:06 Uhr
Goto Top
Hier mal die ausgabe von -Verbose im Skript:
AUSFÜHRLICH: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: x:\Quelle\Text.txt Ziel: D:\Ziel\Text.txt".  
AUSFÜHRLICH: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: x:\Quelle\Textdoku .txt Ziel: D:\Ziel\Textdoku .txt".  
AUSFÜHRLICH: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: x:\Quelle\Textdokument.txt Ziel: D:\Ziel\Textdokument.txt".  
AUSFÜHRLICH: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: x:\Quelle\Ordner\Dokument.rtf Ziel: D:\Ziel\Ordner\Dokument.rtf".  
Für mich war das etwas unübersichtlich.

Hab die Ausgabe für mich jetzt so gelöst:
Beim ersten Kopieren:
D:\Ziel\Text.txt
D:\Ziel\Textdoku .txt
D:\Ziel\Textdokument.txt
D:\Ziel\Ordner\Dokument.rtf
Press Enter Exit...:

Wenn sich alle Dateien ändern würden:
D:\Ziel\\Text_01.txt
D:\Ziel\\Textdoku _01.txt
D:\Ziel\\Textdokument_01.txt
D:\Ziel\\Ordner\Dokument_01.rtf
Press Enter Exit...:

oder nur eine Datei:
D:\Ziel\\Textdoku _02.txt
Press Enter Exit...:

Das müsste geändert werden wenn man es so haben will.

    $_ | copy-item -Destination $dest
    echo $dest 
}
Read-Host -Prompt "Press Enter Exit..."