我想压缩一个路径(其中运行一个服务窗口)。
当服务停止时,它工作正常,当服务运行时,我有例外:
该进程无法访问该文件,因为该文件正在被另一个进程使用。
但是,当我使用 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在第一行使用即可执行此操作
访问另一个进程正在使用的文件的一个好方法是使用卷影复制服务创建快照。
为此,只需使用 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
| 归档时间: |
|
| 查看次数: |
19240 次 |
| 最近记录: |