如何将一个文件夹中的多个文件压缩到一个压缩文件夹中?

时间:2019-05-29 04:50:52

标签: powershell compression

我尝试通过Powershell脚本自动执行重复性场景:

我有一个压缩( .zip)文件夹,其中包含多个文件( .XML)。

我的情况是:

  • 解压缩此文件夹,位于:C:\Users\*\Downloads
  • 更改每个文件中特定内容的值
  • 将所有文件压缩到具有相同名称(格式:AppName.Version.zip)的文件夹中,该文件夹将位于同一路径:C:\Users\*\Downloads中。

问题:

  1. 如何再次压缩文件夹,以便通过单击compress文件夹,我将立即看到文件(压缩文件夹>文件)而不是文件夹,然后是文件(压缩文件夹>文件)

  2. Compress和Expand命令对的文件夹名称格式大喊大叫,因此这些命令无法正常工作。我该如何克服?

     $languageString = Read-Host ...
     $replaceString = '<value>' + $languageString
     $file = Get-Childitem "c:\users\*\Downloads\app.version.zip" -Recurse
     $originalFileName = $file.Name
     $absoluteFilePath = $file.FullName
     $rename-item -path $absoluteFilePath -newname translate.zip
     $file = Get-Childitem "c:\users\*\Downloads\translate.zip" -Recurse
     $absoluteFilePath = $file.FullName
     $unzipFilePath = $absoluteFilePath.Substring(0, $absoluteFilePath.LastIndexOf('.'))
     expand-archive -path $absoluteFilePath -destinationpath $unzipFilePath
     $files = @(Get-Childitem "c:\users\*\Downloads\*.xml)
     foreach ($file in $files)
     {
        (Get-Content -path $file.FullName -Raw) -replace '<value>' , $replaceString | Set-Content -Path $file.FullName

    #this line makes problems...

     Compress-Archive -path $unzipFilePath -Destinationpath $unzipFilePath -Force

1 个答案:

答案 0 :(得分:0)

我通过三个步骤看到它: 1.解压缩在临时清洁的位置。 2.在那里更改文件 3.将该位置拉回。

代码将具有以下功能:

function Unzip_archive ($ArchiveFullPath, $Temp_Work_Fld) {
    try {
        #unzip
        Add-Type -assembly 'system.io.compression.filesystem'
        [io.compression.zipfile]::ExtractToDirectory($ArchiveFullPath, $Temp_Work_Fld)
    }
    catch {
        throw "Failed to unzip the artifact"
    }
    Remove-Item $ArchiveFullPath -Force #only if you want to delete the archive
}

function CreateZipArchive($FolderToArchive, $ZipArchiveFullName){ 
    $source = Get-ChildItem * -Directory | Where-Object {$_.FullName -match "$FolderToArchive"}
    write-host "`nArchiving: $source ........."
    Add-Type -Assembly system.IO.compression.filesystem
    $compressionlevel = [System.IO.Compression.CompressionLevel]::Optimal
    [io.compression.zipfile]::CreateFromDirectory($source, $ZipArchiveFullName, $compressionlevel, $true)
    write-host "nDone !"
} 

然后只需在临时文件夹中进行更改之前和之后调用函数