1、压缩
因为Powershell中没有提供关于压缩的命令,所以需要调用.Net中的对象来完成压缩功能
#-----------------------------------------------------------------
# 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()
}
2、解压缩
Powershell自带命令
#-----------------------------------------------------------------
# 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
}
}