如何将压缩文件存入源文件夹?PowerShell压缩进程占用报错求助
解决PowerShell压缩文件时的“文件被占用”问题并实现需求
首先得说清楚你原来的命令为什么会报错:[io.compression.zipfile]::CreateFromDirectory是用来压缩整个文件夹的全部内容的,你把输出路径直接指定为源文件夹C:\FolderOne时,它会默认生成一个和文件夹同名的FolderOne.zip放在这个文件夹里。但压缩过程中,这个新生成的zip文件会被当前压缩进程锁定,同时方法还要读取整个文件夹的内容(包括刚生成的这个zip),这就触发了“文件被其他进程占用”的错误。而且你的需求是压缩单个TextFile.txt成同名zip,用这个方法本身就不对哦。
下面给你两种针对性的解决方案:
方案1:压缩单个文件到同目录(完全匹配你的期望)
如果你只需要压缩TextFile.txt这一个文件,直接用PowerShell自带的Compress-Archive命令最方便,语法简单还不会踩坑:
Compress-Archive -Path "C:\FolderOne\TextFile.txt" -DestinationPath "C:\FolderOne\TextFile.zip" -Force
-Force参数的作用是覆盖已经存在的同名zip文件,如果不需要覆盖可以去掉这个参数。- 执行完之后,
C:\FolderOne里就会同时存在TextFile.txt和TextFile.zip,完全符合你的预期效果。
方案2:如果需要压缩整个文件夹的内容(避免占用错误)
要是你实际需求是压缩C:\FolderOne里的所有文件,那不能直接把zip文件放在源文件夹里,或者用更省心的方式处理:
方式A:用.NET方法配合临时路径
先把zip生成到临时目录,再移动到目标文件夹:
# 定义临时zip路径 $tempZipPath = "C:\Temp\FolderOne.zip" # 创建临时zip [io.compression.zipfile]::CreateFromDirectory("C:\FolderOne", $tempZipPath) # 移动到源文件夹 Move-Item -Path $tempZipPath -Destination "C:\FolderOne\FolderOne.zip" -Force
方式B:直接用Compress-Archive(推荐)
Compress-Archive会自动处理文件占用的问题,不需要手动折腾临时路径:
Compress-Archive -Path "C:\FolderOne\*" -DestinationPath "C:\FolderOne\FolderOne.zip" -Force
补充说明
之所以原来的命令报错,核心原因是:当CreateFromDirectory在源文件夹内创建zip文件后,它会遍历源文件夹的所有内容(包括刚创建的zip)进行压缩操作,但此时zip文件正被当前进程打开写入,无法被读取,所以抛出了文件占用的错误。
内容的提问来源于stack exchange,提问作者v_kumar
相关产品推荐
相关产品推荐

