Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Powershell或命令行在Windows中创建压缩/压缩文件夹_Windows_Powershell_Command Line_Compression - Fatal编程技术网

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

使用Powershell或命令行在Windows中创建压缩/压缩文件夹,windows,powershell,command-line,compression,Windows,Powershell,Command Line,Compression,我正在创建一个夜间数据库模式文件,并希望将每晚创建的所有文件(每个数据库一个)放入一个文件夹并压缩该文件夹。 我有一个创建架构的PowerShell脚本。只创建db的脚本,然后将所有文件添加到新文件夹。问题在于此过程的压缩部分 有人知道这是否可以通过预安装的处理文件夹压缩的Windows实用程序来实现吗 如果可能的话,最好使用该实用程序,而不是像7zip这样的东西(我不想在每个客户的服务器上安装7zip,如果我要求他们这样做,可能需要几年时间)。这里有几个与zip相关的功能,它们不依赖扩展: 您

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

有人知道这是否可以通过预安装的处理文件夹压缩的Windows实用程序来实现吗


如果可能的话,最好使用该实用程序,而不是像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") ;