使用Powershell或命令行在Windows中创build压缩/压缩文件夹

我正在创build一个夜间数据库模式文件,并希望将每个晚上创build的所有文件(每个数据库一个文件)放入一个文件夹并压缩该文件夹。 我有一个PowerShell脚本来创build模式。只有数据库的创build脚本,然后将所有文件添加到一个新的文件夹。 问题在于这个过程的压缩部分。

有没有人有任何想法,如果这可以完成与预处理文件夹压缩的Windows实用工具?

如果可能,最好使用该工具,而不是像7zip(我不想在每个客户的服务器上安装7zip,如果我问他们可能需要花费IT时间)。

以下是一些不依赖于扩展的与zip相关的函数: 使用Windows PowerShell压缩文件 。

你可能感兴趣的主要功能是:

function Add-Zip { param([string]$zipfilename) if(-not (test-path($zipfilename))) { set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) (dir $zipfilename).IsReadOnly = $false } $shellApplication = new-object -com shell.application $zipPackage = $shellApplication.NameSpace($zipfilename) foreach($file in $input) { $zipPackage.CopyHere($file.FullName) Start-sleep -milliseconds 500 } } 

用法:

 dir c:\demo\files\*.* -Recurse | Add-Zip c:\demo\myzip.zip 

有一个警告:如果路径不是绝对的, shell.application对象的NameSpace()函数将无法打开用于写入的zip文件。 所以,如果你传递了一个相对路径到Add-Zip ,它将会失败并出现一个空错误,所以zip文件的路径必须是绝对路径。

或者你可以在函数的开头添加一个$zipfilename = resolve-path $zipfilename

最新的.NET 4.5框架的本地方式,但完全没有功能:

创建:

 Add-Type -Assembly "System.IO.Compression.FileSystem" ; [System.IO.Compression.ZipFile]::CreateFromDirectory("c:\your\directory\to\compress", "yourfile.zip") ; 

萃取:

 Add-Type -Assembly "System.IO.Compression.FileSystem" ; [System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:\your\destination") ; 

如上所述,完全没有功能,所以不要指望覆盖标志。

这里压缩。\内容到。\ out.zip与System.IO.Packaging.ZipPackage下面的例子

 $zipArchive = $pwd.path + "\out.zip" [System.Reflection.Assembly]::Load("WindowsBase,Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35") $ZipPackage=[System.IO.Packaging.ZipPackage]::Open($zipArchive, [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite") $in = gci .\in | select -expand fullName [array]$files = $in -replace "C:","" -replace "\\","/" ForEach ($file In $files) { $partName=New-Object System.Uri($file, [System.UriKind]"Relative") $part=$ZipPackage.CreatePart($partName, "application/zip", [System.IO.Packaging.CompressionOption]"Maximum") $bytes=[System.IO.File]::ReadAllBytes($file) $stream=$part.GetStream() $stream.Write($bytes, 0, $bytes.Length) $stream.Close() } $ZipPackage.Close() 

从PowersShell 5起,有一个Compress-Archive cmdlet可以完成任务。

使用voithos的答案在PowerShell中压缩文件,只是有一个问题与Add-Zip函数,如果该文件不能完全压缩在那个时间,开始 – 睡眠 – milliseconds 500造成的问题 – >下一个开始在它完成之前导致错误和一些文件不被压缩。

所以在玩了一下之后,首先试着让一个计数器去检查$ zipPackage.Items()的计数,并且只在计数增加之后继续计数(这不起作用,因为它在某些情况下会返回0不应该)我发现它将返回0如果包仍然压缩/复制文件(我想,哈哈)。 添加一个简单的while循环,其中包含启动睡眠,等待zipPackage.Items()。计数为非零值,然后继续,这似乎解决了问题。

 function Add-Zip { param([string]$zipfilename) if(-not (test-path($zipfilename))) { set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) (dir $zipfilename).IsReadOnly = $false } $shellApplication = new-object -com shell.application $zipPackage = $shellApplication.NameSpace($zipfilename) foreach($file in $input) { $zipPackage.CopyHere($file.FullName) do { Start-sleep -milliseconds 250 } while ($zipPackage.Items().count -eq 0) } } 

使用PowerShell版本3.0:

 Copy-ToZip -File ".\blah" -ZipFile ".\blah.zip" -Force 

希望这可以帮助。