我创建一个夜间数据库schema文件,并希望把创建的每个晚上,每个数据库中的所有文件,放到一个文件夹并压缩该文件夹。 我有一个创建数据库的的schema.Only创建脚本,然后将所有的文件到一个新的文件夹中的PowerShell脚本。 问题在于该方法的压缩部分内。
没有任何人有任何想法,如果这可以用预装的Windows实用程序,处理文件夹压缩来实现?
这将是最好使用工具如果可能的话,而不是像7zip的(我不觉得像每一个客户的服务器上安装7zip的,它可能需要IT几年这样做,如果我问他们)。
我创建一个夜间数据库schema文件,并希望把创建的每个晚上,每个数据库中的所有文件,放到一个文件夹并压缩该文件夹。 我有一个创建数据库的的schema.Only创建脚本,然后将所有的文件到一个新的文件夹中的PowerShell脚本。 问题在于该方法的压缩部分内。
没有任何人有任何想法,如果这可以用预装的Windows实用程序,处理文件夹压缩来实现?
这将是最好使用工具如果可能的话,而不是像7zip的(我不觉得像每一个客户的服务器上安装7zip的,它可能需要IT几年这样做,如果我问他们)。
这里有一对夫妇的拉链相关的功能不依赖于扩展: 压缩文件使用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") ;
如前所述,完全功能少,所以不要指望一个覆盖国旗。
作为PowersShell 5的存在压缩-归档 cmdlet的,做任务开箱。
这将压缩。\在内容上。\ 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()
二手voithos'答案在PowerShell中zip文件了,只是有一个问题加载邮编功能,启动睡眠-milliseconds 500所导致的问题,如果该文件不能被完全在那个时候拉上 - >下一个起点在完成前造成的错误和一些文件不被拉链。
所以,玩弄了一下,先试着去柜台去检查$ zipPackage.Items(的数量),只有项目后,持续计数后增加(没有工作,因为它会在某些情况下,返回0时不应该)我发现,它会返回0,如果包仍然荏苒/将文件复制到(我想,哈哈)。 添加了一个简单的while循环与它内部开始休眠,等待zipPackage.Items()。count要继续之前非零值,这似乎解决问题。
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
希望这可以帮助。