You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 15:23:14