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