Powershell 压缩存档错误:无法访问该文件,因为其他进程正在使用该文件

Powershell 压缩存档错误:无法访问该文件,因为其他进程正在使用该文件,powershell,Powershell,我想压缩一个路径(里面有一个运行windows的服务) 当服务停止时,它工作正常,当服务运行时,我有一个例外: 进程无法访问该文件,因为另一个进程正在使用该文件 过程 然而,当我用7-zip压缩时,我没有任何例外 我的命令: Compress-Archive [PATH] -CompressionLevel Optimal -DestinationPath("[DEST_PATH]") -Force 您有没有办法在没有此异常的情况下执行此任务?访问另一个进程正在使用的文件的一个好方法是使用创建

我想压缩一个路径(里面有一个运行windows的服务)

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

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

然而,当我用7-zip压缩时,我没有任何例外

我的命令:

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

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

访问另一个进程正在使用的文件的一个好方法是使用创建快照

为此,只需使用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, "")
现在,您可以将
$snapshotPath
用作
-Path
,用于
压缩存档
调用

此方法还可用于创建带有符号链接的备份。 从那时起,您可以使用链接的文件夹复制备份的文件,或在没有访问异常的情况下压缩这些文件


我在本文中创建了一个类似的函数和一个小型Cmdlet:

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

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

Copy-Item -Path "C:\Temp\somefolder" -Force -PassThru | 
Get-ChildItem |
Compress-Archive -DestinationPath "C:\Temp\somefolder.zip"
其思想是通过管道传递所有复制的项,而不必在压缩之前先将它们复制到特定的目标

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


子文件夹已包括在内。无需在第一行中使用
-recurse
来执行此操作

有一个类似的要求,即只需向zip添加少量扩展。 通过这种方法,我们可以将所有文件(包括锁定的文件)复制到临时位置>压缩文件,然后删除日志

这是一个有点漫长的过程,但使我的一天

$filedate = Get-Date -Format yyyyMddhhmmss
$zipfile = 'C:\Logs\logfiles'+ $filedate +'.zip'

New-Item -Path "c:\" -Name "Logs" -ItemType "directory" -ErrorAction SilentlyContinue

Robocopy "<Log Location>" "C:\CRLogs\" *.txt *.csv *.log /s
Get-ChildItem -Path "C:\Logs\" -Recurse | Compress-Archive -DestinationPath $zipfile -Force -ErrorAction Continue
Remove-Item -Path "C:\Logs\" -Exclude *.zip -Recurse -Force
$filedate=获取日期-格式YYYYMDDHMMSS
$zipfile='C:\Logs\logfiles'+$filedate+'.zip'
新项目-路径“c:\”-名称“日志”-项目类型“目录”-错误操作SilentlyContinue
Robocopy”““C:\CRLogs\”*.txt*.csv*.log/s
Get ChildItem-Path“C:\Logs\”-Recurse | Compress Archive-DestinationPath$zipfile-Force-ErrorAction Continue
删除项-路径“C:\Logs\”-排除*.zip-递归-Force

尝试使用powershell中的7zip作为解决方法,请参阅您是否有任何想法可以在没有此异常的情况下执行此任务?使用快照?错误发生在未修改的文件(.dll)上。因此,快照不应该是problem@Manu我批准了你的编辑。编辑时,请同时使用。继续努力@鲍勃:我的意思是你应该使用快照来避免你的异常。请参阅我的答案。注意,这会覆盖(例如,如果您多次运行此操作),然后将复制的文件保留在当前工作目录中。我只是在使用此方法,它看起来就像您执行
复制项目时一样,即使您正在对其进行管道传输,它也会将文件复制到您的PWD。所以对我来说,它碰巧是C:\Windows\System32…它在那里创建了一堆垃圾。这是一个很大的缺点,就像其他人说的那样,将文件复制到你的PWD上。有害副作用