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:\“.
1 2 |
#Für Win7 vssadmin create shadow /for=e: |
1 2 |
#Für Win10 wmic shadowcopy call create Volume='E:\' |
1 |
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:
1 |
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
1 |
rd e:\backup |
Schattenkopie löschen
Um die Schattenkopie selber zu löschen, gibt es den Befehl
1 |
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
1 |
vssadmin Delete Shadows /Shadow=ShadowId [/quiet] |
oder/und auf ein Laufwerk begrenzen (z.B.: Laufwerk e:\)
1 |
vssadmin Delete Shadows /For=e:\ [/oldest] [/quiet] |