Wie bewahre ich Zeitstempel für alle Ordner auf, wenn Sie sie von einem NTFS-Laufwerk auf ein anderes verschieben?

524
Devon Heath

Ich möchte einen Ordner (der viele Unterordner und Dateien enthält) von einem NTFS-Laufwerk in ein anderes verschieben.

Anmerkung: Ich habe festgestellt, dass die Zeitstempel ("Erstellungsdatum", "Datum der letzten Änderung" usw.) bei Ordnern mit mindestens einem Ordner / einer Datei nicht beibehalten werden. Selbst leere Ordner, die verschoben wurden, ändern das Erstellungsdatum "automatisch", um sich an den Rest anzupassen (sobald Sie etwas in diesem leeren Ordner auf dem neuen Laufwerk ablegen).

Mein Aufwand: Ich habe fast alles versucht, was ich über Google zu diesem Thema finden konnte (Robocopy, Richcopy, Microsoft SyncToy, Total Commander, Free Commander ... und viele, viele mehr ...) - alle produzieren relativ gleich Ergebnisse. Nichts hat zu einer umfassenden, 100% igen Erhaltung der zu bewegenden Quelle geführt. Robocopy und Richcopy (zusammen mit den "Commanders") kommen nahe, aber ich habe immer noch Probleme (in allen Fällen), bei denen das Erstellungsdatum falsch "beibehalten" wurde, das letzte Änderungsdatum nicht beibehalten werden kann usw. Das einzig wahre Versprechen Ich habe darüber hinaus gesehen ... ist Powershell.


Meine PowerShell-Reise

Ich bin auf diesen Link gestoßen:

https://stackoverflow.com/questions/34951911/powershell-move-item-folder-time-stamp

... mit diesem Skript:

function Move-FileWithTimestamp { [cmdletbinding()] param( [Parameter(Mandatory=$true,Position=0)][string]$Path, [Parameter(Mandatory=$true,Position=1)][string]$Destination )  $origLastAccessTime = ( Get-Item $Path ).LastAccessTime $fileName = ( Get-Item $Path ).Name Move-Item -Path $Path -Destination $Destination $(Get-Item ($Destination+'\'+$fileName)).LastAccessTime =  $origLastAccessTime } 

Das Skript im obigen Thread war immer noch nicht anders als die Programme, die ich aufgelistet hatte, aber zumindest hier hatte ich eine Plattform, auf der ich möglicherweise einige Dinge für meine genauen Bedürfnisse ändern / anpassen / anpassen konnte. Also tat ich, was ich konnte, mit meinem begrenzten Wissen in diesem Bereich (z. B. ".LastAccessTime" mit ".CreationTime" ändern, ".LastAccessTime" mit "LastWriteTime" usw. tauschen) und schließlich alle Zeitstempel relativ erhalten ( Ich glaube, zu einem bestimmten Zeitpunkt hatte ich die zuletzt geänderten, zuletzt aufgerufenen und zuletzt in meinem Testordner gespeicherten Änderungen erhalten. Ich kann das Erstellungsdatum jedoch immer noch nicht korrekt beibehalten, und was ich mit allen anderen Funktionen erreicht habe, gilt offensichtlich nur für den Testordner (und nichts anderes wie die Unterordner darin). Dies ist jedoch der Fall nur weil ich nicht

Ich bin über meinen Kopf, wenn es um dieses Zeug geht, also frage ich mich, ob irgendjemand da draußen etwas dagegen unternehmen will.

UPDATE: Hier bin ich jetzt:

function Move-FileWithTimestamp { [cmdletbinding()] param( [Parameter(Mandatory=$true,Position=0)][string]$Path, [Parameter(Mandatory=$true,Position=1)][string]$Destination ) $origCreationTime = ( Get-Item $Path ).CreationTime $origLastWriteTime = ( Get-Item $Path ).LastWriteTime $origLastAccessTime = ( Get-Item $Path ).CreationTime  $fileName = ( Get-Item $Path ).Name Move-Item -Path $Path -Destination $Destination $(Get-Item ($Destination+'\'+$fileName)).CreationTime = $origCreationTime $(Get-Item ($Destination+'\'+$fileName)).LastWriteTime =  $origLastWriteTime $(Get-Item ($Destination+'\'+$fileName)).LastAccessTime =  $origLastAccessTime } 

Dies scheint die ursprüngliche Erstellungszeit für das Verschieben des Hauptordners (sowie die letzte Änderungs- / Schreibzeit) beizubehalten, aber offensichtlich ändert sich die Zeit, auf die zuletzt zugegriffen wurde, in die ursprüngliche Erstellungszeit (es scheint, als wäre ein Ordner vorhanden.) auf ein neues Laufwerk verschoben, ändert Windows standardmäßig den Zeitpunkt des letzten Zugriffs während dieses Vorgangs, und ALSO bezieht sich auf diesen neuen Zeitpunkt, auf den zuletzt zugegriffen wurde, um den neuen Erstellungszeitpunkt des Ordners an seinem neuen Speicherort zu erstellen (es bezieht sich NICHT auf den Ursprüngliche Erstellungszeit, auch wenn dies der Fall ist, dh wenn Sie versuchen, die neue Erstellungszeit gleich der ursprünglichen Erstellungszeit einzustellen, führt dies zu keinem Ergebnis, da die zuletzt aufgerufene Zeit standardmäßig automatisch die neue Erstellungszeit ändert Sie zwingen Windows, die zuletzt aufgerufene Zeit der ursprünglichen Erstellungszeit anzupassen.dann landen Sie letztendlich mit der korrekten Erstellungszeit, jedoch mit der falschen Zeit, zu der Sie zuletzt zugegriffen haben.

So, jetzt bin ich mit einer falschen letzten Zeit verbunden, aber korrekt für alles andere. Ich habe auch keine Ahnung, wie ich das auf alle Unterordner anwenden kann, also lassen Sie es mich wissen, wenn jemand weiß, wie das geht.

AKTUALISIEREN:

function Move-FileWithTimestamp { [cmdletbinding()] param( [Parameter(Mandatory=$true,Position=0)][string]$Path, [Parameter(Mandatory=$true,Position=1)][string]$Destination ) $origCreationTime = ( Get-Item $Path ).CreationTime $origLastWriteTime = ( Get-Item $Path ).LastWriteTime $origLastAccessTime = ( Get-Item $Path ).CreationTime $origChildCreationTime = ( Get-ChildItem $Path ).CreationTime $origChildLastWriteTime = ( Get-ChildItem $Path ).LastWriteTime $origChildLastAccessTime = ( Get-ChildItem $Path ).CreationTime   $fileName = ( Get-Item $Path ).Name Move-Item -Path $Path -Destination $Destination $(Get-Item ($Destination+'\'+$fileName)).CreationTime = $origCreationTime $(Get-Item ($Destination+'\'+$fileName)).LastWriteTime = $origLastWriteTime $(Get-Item ($Destination+'\'+$fileName)).LastAccessTime =  $origLastAccessTime $(Get-ChildItem ($Destination+'\'+$fileName)) | ForEach-Object {  $_.CreationTime = $origChildCreationTime } $(Get-ChildItem ($Destination+'\'+$fileName)) | ForEach-Object {  $_.LastWriteTime = $origChildLastWriteTime } $(Get-ChildItem ($Destination+'\'+$fileName)) | ForEach-Object {  $_.LastAccessTime = $origChildLastAccessTime } } 

Jetzt habe ich einen Hauptordner und einen, wenn es Unterordner mit korrekten Erstellungs- und letzten Änderungsdaten (aber nicht zuletzt) ​​ist. Ich habe keine Ahnung, wie ich dies für den Rest der Unterordner im Hauptordner und für alle Unterordner in diesen Unterordnern bewerkstelligen kann.

2
Sagen Sie mir, dass "Robocopy / copyall" nicht funktioniert? Appleoddity vor 5 Jahren 0
Zum Kommentar für OP kopiert: Um Ihre Frage zu beantworten: Nein, Robocopy behält die 3 Hauptzeitstempel für mich nicht in Ordnern (erstellt, zuletzt geändert und zuletzt aufgerufen). Ich habe schon alle Schalter versucht. Ich denke auf jeden Fall, dass es mit Powershell eine Möglichkeit gibt, dies zu erreichen. Ich bin jedoch mit Codierung und Skripten einfach nicht vertraut. Deshalb hoffe ich, dass jemand da draußen einen Blick darauf werfen kann: "Oh, das ist einfach". fixer1234 vor 5 Jahren 0

1 Antwort auf die Frage

1
Pimp Juice IT

Verschieben Sie die Verzeichnisstruktur und behalten Sie alle Zeitstempelattributwerte bei

Also Ihr Ziel ist es, sicherzustellen, dass die Dateien und Ordner, die von einem Quellort über zu einem Zielort ihr haben bewegt werden LastWriteTime, LastAccessTimeund CreationTimeAttributwerte aus dem Quellort beibehalten, wo diejenigen, entstanden.

Im Wesentlichen das. . .

Skript

$src = "C:\Src\Folder\123\" $dest = "X:\Dest\Folder\321\" $src = $src.Replace("\","\\")  $i = Get-ChildItem -Path $src -Recurse $i | % { ## -- All files and folders  $apath = $_.FullName -Replace $src,"" $cpath = $dest + $apath  Copy-Item -Path $_.FullName -Destination $cpath -Force  If (Test-Path $cpath) { Set-ItemProperty -Path $cpath -Name CreationTime -Value $_.CreationTime Set-ItemProperty -Path $cpath -Name LastWriteTime -Value $_.LastWriteTime Set-ItemProperty -Path $cpath -Name LastAccessTime -Value $_.LastAccessTime } }  $d = Get-ChildItem -Path $src -Recurse -Directory $d | % { ## -- Folders only  $apath = $_.FullName -Replace $src,"" $cpath = $dest + $apath  If (Test-Path $cpath) { Set-ItemProperty -Path $cpath -Name CreationTime -Value $_.CreationTime Set-ItemProperty -Path $cpath -Name LastWriteTime -Value $_.LastWriteTime Set-ItemProperty -Path $cpath -Name LastAccessTime -Value $_.LastAccessTime } }   $f = Get-ChildItem -Path $src -Recurse -File $f | % { ## -- Delete files only  $apath = $_.FullName -Replace $src,""  $cpath = $dest + $apath  If (Test-Path $cpath) { Remove-Item $_.FullName -Force -ErrorAction SilentlyContinue } }   $d | % { ## -- Delete directories only  $apath = $_ -Replace $src,""  $cpath = $dest + $apath  If (Test-Path $cpath) { Remove-Item $_.FullName -Recurse -Force -ErrorAction SilentlyContinue } } 

Weitere Ressourcen

Kommentare sind nicht für eine erweiterte Diskussion vorgesehen. Diese Konversation wurde [zum Chat verschoben] (https://chat.stackexchange.com/rooms/84436/discussion-on-answer-by-pimp-juice-it-how-to-preserve-timestamps-for-all- Ordner). DavidPostill vor 5 Jahren 0
@DavidPostill Können Sie mir einen Link geben, um zu erfahren, wie ich das tun kann? Ich bekomme immer lange Kommentare und bekomme nie einen Link, um einen Chat so neugierig zu machen, ob es einen anderen Weg gibt, etwas zu lesen. Ich kann lernen, wie ich diese zu einem Chat übergebe, so dass Mods nicht markiert werden. Pimp Juice IT vor 5 Jahren 0
AFAIK nur Mods können dies tun. DavidPostill vor 5 Jahren 1