压缩存档错误:无法访问该文件,因为该文件正在被另一个进程使用

Bob*_*Bob 11 powershell

我想压缩一个路径(其中运行一个服务窗口)。

当服务停止时,它工作正常,当服务运行时,我有例外:

该进程无法访问该文件,因为该文件正在被另一个进程使用。

但是,当我使用 7-zip 压缩时,没有任何异常。

我的命令:

Compress-Archive [PATH] -CompressionLevel Optimal -DestinationPath("[DEST_PATH]") -Force
Run Code Online (Sandbox Code Playgroud)

您是否有想法在没有此异常的情况下执行任务?

小智 7

Copy-Item允许您访问正在另一个进程中使用的文件。

这是我最终在代码中使用的解决方案:

Copy-Item -Path "C:\Temp\somefolder" -Force -PassThru | 
Get-ChildItem |
Compress-Archive -DestinationPath "C:\Temp\somefolder.zip"
Run Code Online (Sandbox Code Playgroud)

这个想法是,您通过管道传递所有复制的项目,而不必在压缩之前先将它们复制到特定目标。

我喜欢压缩文件夹的内容而不是文件夹本身,因此我Get-ChildItem在最后一行压缩之前使用。

子文件夹已包含在内。无需-recurse在第一行使用即可执行此操作

  • 我只是在玩这个方法,看起来当你执行“Copy-Item”时,即使你正在管道它,它也会将文件复制到你的 PWD 中。所以对我来说,它恰好是 C:\Windows\System32...它在那里创建了一堆垃圾。 (5认同)
  • 请注意,这会覆盖(例如,如果您运行多次),然后将复制的文件保留在当前工作目录中。 (2认同)

Cli*_*ers 2

访问另一个进程正在使用的文件的一个好方法是使用卷影复制服务创建快照。

为此,只需使用 PowerShells WMI Cmdlet:

$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, "")
Run Code Online (Sandbox Code Playgroud)

现在您可以使用$snapshotPathas-Path进行Compress-Archive通话。

此方法还可用于创建带有符号链接的备份。从那里开始,您可以使用链接的文件夹来复制备份文件,或在没有这些访问例外的情况下压缩它们。

我在此 Gist 中创建了一个类似的函数和一个小 Cmdlet:Backup.ps1