由於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 } }