使用Powershell或命令行在Windows中创建压缩/压缩文件夹
我正在创建一个夜间数据库模式文件,并希望将每晚创建的所有文件(每个数据库一个)放入一个文件夹并压缩该文件夹。 我有一个创建架构的PowerShell脚本。只创建db的脚本,然后将所有文件添加到新文件夹。问题在于此过程的压缩部分 有人知道这是否可以通过预安装的处理文件夹压缩的Windows实用程序来实现吗使用Powershell或命令行在Windows中创建压缩/压缩文件夹,windows,powershell,command-line,compression,Windows,Powershell,Command Line,Compression,我正在创建一个夜间数据库模式文件,并希望将每晚创建的所有文件(每个数据库一个)放入一个文件夹并压缩该文件夹。 我有一个创建架构的PowerShell脚本。只创建db的脚本,然后将所有文件添加到新文件夹。问题在于此过程的压缩部分 有人知道这是否可以通过预安装的处理文件夹压缩的Windows实用程序来实现吗 如果可能的话,最好使用该实用程序,而不是像7zip这样的东西(我不想在每个客户的服务器上安装7zip,如果我要求他们这样做,可能需要几年时间)。这里有几个与zip相关的功能,它们不依赖扩展: 您
如果可能的话,最好使用该实用程序,而不是像7zip这样的东西(我不想在每个客户的服务器上安装7zip,如果我要求他们这样做,可能需要几年时间)。这里有几个与zip相关的功能,它们不依赖扩展: 您可能感兴趣的主要功能是:
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文件进行写入。因此,如果您将相对路径传递给添加Zip
,它将失败并出现空错误,因此Zip文件的路径必须是绝对路径
或者,您可以在函数的开头添加一个
$zipfilename=resolve path$zipfilename
。这将压缩。\in contents to.\out.zip,并使用System.IO.Packaging.ZipPackage执行以下示例
使用voithos的答案在powershell中压缩文件,只是添加zip功能有一个问题,如果文件无法在此期间完全压缩,则启动睡眠-500毫秒会导致问题->下一个在完成之前启动会导致错误和一些文件无法压缩 因此,在玩了一会儿之后,首先尝试让计数器检查$zipPackage.Items()的计数,并且只有在项目计数增加后才继续(这不起作用,因为它在某些情况下会返回0,而它不应该返回),我发现如果包仍然在压缩/复制文件,它将返回0(我想,哈哈)。添加了一个简单的while循环,其中包含start sleep,在继续之前等待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
希望这能有所帮助。最新的.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") ;
如前所述,完全没有功能,因此不要期望覆盖标志。从PowerShell 5开始,有一个cmdlet可以立即完成任务。我想这解释了您的选择:非常感谢!这是一个干净而简单的解决方案。其他可能偶然发现这条线索的人的方向。从以下位置下载PowerShell社区扩展:Extract files,然后将目录移动到:C:\Windows\System32\WindowsPowerShell\v1.0\Modules。然后通过运行命令导入模块:import module pscx这确实有效,我感谢您的及时响应,但我认为下载和安装PowerShell社区扩展并提供Write-Zip命令是实现该功能的一种更干净/更简单的方法。@TechDawg270:同意-我主要是出于完整性考虑才发布此消息。这不是PowerShell 3 cmdlet。我使用此解决方案拒绝了访问路径:(你有办法强制执行吗?@Jerome2606…然后让你的路径可以访问。正如前面提到的,“不要期望覆盖标志”
Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:\your\destination") ;