PowerShell实现:按文件名打包XML及同名文件夹并删除原文件
需求与问题解决
原本有一段可正常运行的PowerShell代码,功能是遍历目录中的所有.PDF文件,将其压缩为同名ZIP文件后删除原PDF文件。现在需要修改代码实现以下功能:遍历目标目录中的.xml文件,将该XML文件与同名文件夹(包含所有内容)打包为同名ZIP文件,完成后删除原XML文件和对应文件夹。修改过程中曾遇到无法用OpenRead读取路径的问题,最终得到可行代码,具体如下:
原PDF压缩代码
# 获取目录中的所有文件(不递归) $allFiles = Get-ChildItem -Path $sourceDir -File $files = Get-ChildItem -Path $sourceDir -Filter '*.pdf' -File if ($allFiles.Count -eq 0) { Write-Host "在'$sourceDir'中未找到任何文件。" exit } foreach ($file in $files) { try { # 创建目标ZIP文件路径(同目录、同名、.zip扩展名) $zipPath = Join-Path $sourceDir ($file.BaseName + '.ZIP') # 打开或创建ZIP文件流 $zipStream = [System.IO.File]::Open($zipPath, 'Create') # 在ZIP流中创建新的归档对象 $archive = [System.IO.Compression.ZipArchive]::new($zipStream, 'Create') # 在归档中创建文件条目,使用当前PDF文件的文件名 $entry = $archive.CreateEntry([System.IO.Path]::GetFileName($file.FullName)) # 打开并读取PDF文件数据到归档条目中 $input = [System.IO.File]::OpenRead($file.FullName) $input.CopyTo($entry.Open()) $input.Dispose() # 确保归档内容正确写入并释放资源 $archive.Dispose() # 关闭ZIP文件流 $zipStream.Dispose() Write-Host "已将'$($file.Name)'压缩到'$zipPath'" } catch { Write-Error "压缩'$($file.Name)'失败:$_" } } # 删除已生成对应ZIP的PDF文件 $zipped = Get-ChildItem -Path $sourceDir -Filter '*.ZIP' -File foreach ($zip in $zipped) { $deletePath = Join-Path $sourceDir ($zip.BaseName + '.pdf') Remove-Item -Path $deletePath }
本人尝试修改的问题代码
# 获取目录中的所有XML文件(不递归) $files = Get-ChildItem -Path $sourceDir -Filter '*.xml' -File if ($files.Count -eq 0) { Write-Host "在'$sourceDir'中未找到任何文件。" exit } foreach ($file in $files) { try { # 创建目标ZIP文件路径(同目录、同名、.zip扩展名) $zipPath = Join-Path $sourceDir ($file.BaseName + '.ZIP') # 打开或创建ZIP文件流 $zipStream = [System.IO.File]::Open($zipPath, 'Create') # 在ZIP流中创建新的归档对象 $archive = [System.IO.Compression.ZipArchive]::new($zipStream, 'Create') # 在归档中创建XML文件的条目 $entry = $archive.CreateEntry([System.IO.Path]::GetFileName($file.FullName)) # 读取XML文件数据到归档条目中 $input = [System.IO.File]::OpenRead($file.FullName) $input.CopyTo($entry.Open()) $input.Dispose() # 错误尝试:用OpenRead读取文件夹路径(此处为问题核心) $folderInput = [System.IO.Path]::OpenRead($file.BaseName) $folderInput.CopyTo($entry.Open()) $folderInput.Dispose() # 释放归档资源 $archive.Dispose() # 关闭ZIP文件流 $zipStream.Dispose() Write-Host "已将'$($file.Name)'压缩到'$zipPath'" } catch { Write-Error "压缩'$($file.Name)'失败:$_" } } # 删除已生成对应ZIP的XML文件和同名文件夹 $zipped = Get-ChildItem -Path $sourceDir -Filter '*.ZIP' -File foreach ($zip in $zipped) { $deletePath = Join-Path $sourceDir ($zip.BaseName + '.xml') Remove-Item -Path $deletePath $deletePath = Join-Path $sourceDir ($zip.BaseName) Remove-Item -Path $deletePath }
经帮助后得到的可行代码
foreach ($file in $files) { try { $move = Join-Path $SourceDir $file.BaseName # 将同名文件夹和XML文件移动到临时目录 Move-Item -Path $move -Destination $tempDir Move-Item -Path ($move + '.xml') -Destination $tempDir # 创建目标ZIP文件路径 $zipPath = Join-Path $temp2Dir ($file.BaseName + '.ZIP') # 从临时目录创建ZIP归档,不包含基础目录 [System.IO.Compression.ZipFile]::CreateFromDirectory( $tempDir, $zipPath, [System.IO.Compression.CompressionLevel]::Optimal, $false) Write-Host "已将'$($file.Name)'压缩到'$zipPath'" # 清理临时目录中的文件和文件夹 Get-ChildItem -Path $tempDir -Filter '*.xml' -File -Recurse | Remove-Item -Force $del = Join-Path $tempDir $file.BaseName Remove-Item $del -Recurse -Force } catch { Write-Error "压缩'$($file.Name)'失败:$_" } } # 将生成的ZIP文件归档到目标目录 Copy-Item -Path "$temp2Dir\*.ZIP" -Destination $archiveDir -Recurse -Force # 清理临时ZIP文件 Get-ChildItem -Path $temp2Dir -Filter '*.ZIP' -File -Recurse | Remove-Item -Force
内容的提问来源于stack exchange,提问作者user31786750
相关产品推荐
相关产品推荐

