PowerShell壓縮與解壓縮

一、壓縮

由於Powershell中沒有提供關於壓縮的命令,因此須要調用.Net中的對象來完成壓縮功能shell

#-----------------------------------------------------------------
# NAME          : zip
# DESCRIPTION   : 壓縮文件
# PARAMETER     : (in)fileDirectory = 待壓縮的文件夾路徑
#                               : (in)zipDirectory = 生成的壓縮文件的路徑
# RETURN              : 無
# 備考                      : 調用.Net的壓縮類庫
#-----------------------------------------------------------------
function zip([String]$fileDirectory, $zipDirectory){
    #加載依賴
    [System.Reflection.Assembly]::Load("WindowsBase,
       Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")

    #最終輸出的Zip文件,以時間動態生成。
    $zipPath = $zipDirectory + (Get-Date).ToString('yyyy-MM-dd hh-mm-ss') + ".zip"
    #刪除已有的壓縮包
    if (Test-Path($ZipPath)){
    	Remove-Item $ZipPath
    }

    #獲取文件集合
    $Di=New-Object System.IO.DirectoryInfo($fileDirectory);
    $files = $Di.GetFiles()
    if($files.Count -eq 0){
    	exit
    }

    #打開壓縮包
    $pkg=[System.IO.Packaging.ZipPackage]::Open($ZipPath,
       [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")

    #加入文件到壓縮包
    ForEach ($file In $files)
    {
    	$uriString="/" +$file.Name
    	$partName=New-Object System.Uri($file, [System.UriKind]"Relative")
        
    	$pkgPart=$pkg.CreatePart($partName, "application/zip",
    		[System.IO.Packaging.CompressionOption]"Maximum")
        # 注意:待壓縮文件內容過大時,使用ReadAllBytes方法,可能會致使內存溢出
        #             請使用其餘方式進行文件內容讀取
    	$bytes=[System.IO.File]::ReadAllBytes($file.FullName)
    	$stream=$pkgPart.GetStream()
    	$stream.Seek(0, [System.IO.SeekOrigin]"Begin");
    	$stream.Write($bytes, 0, $bytes.Length)
    	$stream.Close()
    }

    #關閉壓縮包
    $pkg.Close()
}

二、解壓縮

Powershell自帶命令app

#-----------------------------------------------------------------
# NAME                  : unzip
# DESCRIPTION   : 解壓文件
# PARAMETER     : (in)zipFile = 待解壓文件的路徑
#                               : (in)target = 解壓路徑
# RETURN              : 無
#-----------------------------------------------------------------
function unzip([String]$zipFile, [String]$target){
    #解壓完了是否打開文件夾
    $ShowDestinationFolder = $true
     
    if (!(Test-Path $target)) {
        mkdir $target
    }
     
    $shellApp = New-Object -ComObject Shell.Application
    
    $zipFileFolder = $shellApp.NameSpace($zipFile)
    $targetFolder = $shellApp.NameSpace($target)
    $files = $zipFileFolder.Items()
    
    #重複解壓某一個文件,會彈出是否覆蓋原文件的提示
    #不彈出提示的解決案 : 在target目錄下查找(-f)已被解壓的文件,而後刪除
    # % : ForEach-Object的別名
    #↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    $files|%{
        if(Test-Path("$target/{0}" -f $_.name)){
            Remove-Item ("$target/{0}" -f  $_.name ) -Force -Recurse
        }
    }
    #↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    
    $targetFolder.CopyHere($files)
     
    if ($ShowDestinationFolder) {
     #打開解壓後的文件夾
      explorer.exe $target
    }
}
相關文章
相關標籤/搜索