Möchte man mit copy/xcopy/robocopy
Verzeichnisse mit geöffneten Dateien kopieren (z.B.: das Systemverzeichnis) bekommt man immer die Meldung, dass Dateien nicht kopiert werden konnten, da sie gerade verwendet werden.
Die Lösung heißt hier: Volume Shadow Copy (oder Schattenkopie).
Der Testaufbau
Für diesen Test existiert auf einer Festplatte „E:“ ein Verzeichnis „1_Quelle“ und „2_Ziel“.
Im Quellverzeichnis befinden sich 2 Text-Dateien und eine Access-Datenbank (welche die geöffnete Datei simulieren soll).
Führt man nun ein robocopy aus, welches die die Dateien von „1_Quelle“ Nach „2_Ziel“ kopieren soll, erhält man die Fehlermeldung
…. ERROR 32 (0x00000020) Copying File e:\1_Quelle\Test-Datenbank.accdb
The process cannot access the file because it is being used by another process.
Es wurden also nur die beiden, ungeöffneten, Text-Dateien kopiert.
Schattenkopie erzeugen
Nun erzeuge ich eine Schattenkopie für das Laufwerk „E:\“.
#Für Win7 vssadmin create shadow /for=e:
#Für Win10 wmic shadowcopy call create Volume='E:\'
Vssadmin list shadows
Kann man jetzt die Schattenkopie auflisten lassen
Hier können auch mehrere Schattenkopien angezeigt werden, wenn diese vorhanden sind. Hier gilt es die richtige Schattenkopie zu finden
Schattenkopie einbinden
Nun kann man diese Schattenkopie einbinden. Wichtig ist hier für uns die Angabe „Schadow Copy Volume: \\?\GLOBALROOT\DEVICE\HarddiskVolumeShadowCopy10“
Der Befehl zum verlinken lautet:
mklink /D e:\backup \\?\GLOBALROOT\DEVICE\HarddiskVolumeShadowCopy10\
(Den Backshlash am Ende nicht vergessen !!!!!)
.
Navigiert man nun in dem erzeugen Link „e:\backup“, findet man nun die gleiche Verzeichnisstruktur wieder, wie auf dem Laufwerk „e:\“
Man kann nun im „live“ Verzeichnis weitere Dateien erzeugen, die Schattenkopie bleibt davon unbehelligt.
Dateien kopieren
Führt man jetzt erneut ein robocopy aus (diesmal als Quelle den Link-Pfad angeben !!),
wird die Datei „Test-Datenbank.accdb“ mit kopiert, obwohl sie noch geöffnet ist. Die Datei „zz_neue Datei.txt“ wurde nicht kopiert, die sie in der Schattenkopie noch nicht verfügbar ist.
Gegenprobe:
Wenn ich nun den robocopy-Befehl erneut mit der original-Pfadangabe „e:\1_Quelle“ ausführe, sollte zwar die neue Datei „zz_neue Datei.txt“, nicht aber die geöffnete Datenbank „Test-Datenbank.accdb“ kopiert weden können.
Link zur Schattenkopie entfernen
Um den Link zur Schattenkopie wieder zu entfernen, reicht ein einfaches Löschen des Links
rd e:\backup
Schattenkopie löschen
Um die Schattenkopie selber zu löschen, gibt es den Befehl
vssadmin delete shadows /all
Das Löschen muss bestätigt werden.
Möchte man keine Rückfrage erhalten, kann man noch den Parameter „/Quiet“
anfügen.
Ebenso gibt es den Parameter „/oldest“
, der nur die älteste Schattenkopie löscht.
Man kann Schattenkopieen auch gezielt, z.B.: über deren ID, löschen
vssadmin Delete Shadows /Shadow=ShadowId [/quiet]
oder/und auf ein Laufwerk begrenzen (z.B.: Laufwerk e:\)
vssadmin Delete Shadows /For=e:\ [/oldest] [/quiet]