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
    }
}
相关文章
相关标签/搜索