2017-11-13 12 views
0

Ich bin neu in PowerShell.Powershell Compress-Archive: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird

Ich möchte einen Pfad (mit einem Dienst Windows im Inneren läuft) zippen.

Wenn der Dienst beendet wird, es funktioniert perfekt, wenn der Dienst ausgeführt wird, habe ich die Ausnahme:

Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.

Allerdings, wenn ich mit 7-zip zip, habe ich keine Ausnahme.

Mein Befehl ist sehr einfach:

Compress-Archive [PATH] -CompressionLevel Optimal -DestinationPath("[DEST_PATH]") -Force 

Haben Sie eine Idee haben die Aufgabe, ohne diese Ausnahme zu erfüllen?

+0

Versuch 7zip für Abhilfe von Powershell zu verwenden, finden Sie https://gallery.technet.microsoft.com/scriptcenter/PowerShell-and-7Zip -83020e74 – Avshalom

+0

_Haben Sie eine Idee, die Aufgabe ohne diese Ausnahme auszuführen? _ Verwenden von Snapshots? – Clijsters

+0

Der Fehler tritt bei einer Datei (.dll) auf, die nicht geändert wird. Also ein Snapshot sollte kein Problem sein – Bob

Antwort

1

Eine gute Methode, um auf Dateien zuzugreifen, die von einem anderen Prozess verwendet werden, ist die Erstellung von Snapshots mit Volume Shadow Copy Service.

Dazu kann man einfach PowerShells WMI-Cmdlets verwenden:

$Path = "C:/my/used/folder" 
$directoryRoot = [System.IO.Directory]::GetDirectoryRoot($Path).ToString() 

$shadow = (Get-WmiObject -List Win32_ShadowCopy).Create($directoryRoot, "ClientAccessible") 
$shadowCopy = Get-WmiObject Win32_ShadowCopy | ? { $_.ID -eq $shadow.ShadowID } 
$snapshotPath = $shadowCopy.DeviceObject + "\" + $Path.Replace($directoryRoot, "") 

Jetzt können Sie die $snapshotPath als -Path für Ihren Compress-Archive Anruf verwenden.

Diese Methode kann auch zum Erstellen von Sicherungen mit Symlinks verwendet werden. Von dort aus können Sie die verknüpften Ordner verwenden, um gesicherte Dateien zu kopieren oder sie ohne diese Access-Ausnahmen zu komprimieren.

Ich habe eine similiar Funktion und eine kleine Cmdlets in diesem Gist: Backup.ps1

Verwandte Themen