仅使用Windows的内置功能,如何从脚本中压缩或解压缩?


294

在Windows中,您可以通过

右键单击→ 发送到压缩(压缩)文件夹

然后双击.zip文件解压缩并解压缩文件。

有没有一种方法可以从脚本(.bat文件)中应用这些功能,而无需安装任何第三方软件



16
好吧,可能是为了从批处理文件或程序中调用它。(这就是我在这里的原因-试图制作一个快速的.BAT文件来为需要将其作为zip文件的网站“构建”一个小产品。)
Jon Coombs

46
疯了,这个问题被关闭了。
山姆·戈德堡

1
可以将这个问题移到“超级用户”吗?
韩寒

21
在2018年仍然非常有用且相关。:P
Michael Fever

Answers:


82

早在2013年,那是不可能的。Microsoft没有为此提供任何可执行文件。

请参阅此链接以了解某些VBS方式。 /superuser/201371/create-zip-folder-from-the-command-line-windows

从Windows 8开始,默认情况下安装.NET Framework 4.5,并提供System.IO.Compression.ZipArchive和PowerShell,可以编写脚本来实现此目的,请参阅 https://stackoverflow.com/a/26843122/71312


1
鉴于PS允许这样做并且PS已预先安装在Windows上并且可以通过命令行使用,所以这是不正确的。
Dan Atkinson

4
@DanAtkinson更新。早在2013年就得到了答复,该链接提供了一些VBS方式。PS方式需要.Net 4.5,而后者需要Windows 8或更高版本。
Diryboy

感谢更新!相应地修改了我的投票。:)
丹·阿特金森

6
@MichaelMrozek好吧,“命令行”通常是指任何命令行,而不是专门用于CMD / COMMAND,而PS绝对是命令行,* nix上的bash,sh,rsh也是如此。但是,仅此而已,因为您可以从命令行运行powershell,所以即使您希望cmd / command是唯一的命令行,它也可以回答问题。
罗伯特·麦基

1
在2013年可能回(无需安装任何额外的软件)。请参阅超级用户问题。自Windows XP于2001年问世以来,它就已经成为可能。可以利用Windows XP中的内置ZIP功能,因为它是通过COM接口公开的。
彼得·莫滕森

180

要扩展Steven Penny的PowerShell解决方案,您可以通过调用powershell.exe将其合并到批处理文件中,如下所示:

powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar'); }"

正如Ivan Shilo所说,这不适用于PowerShell 2,它需要PowerShell 3或更高版本以及.NET Framework 4。


1
实际上,这在.NET 4.5中可用。
qJake 2015年

10
对于那些想知道如何提取到实际目录(而不是创建新目录)的人(如我),只需将目标参数设置为'.',例如:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin

我们可以使用这些命令来增加压缩率吗?像使其超压缩以减小文件大小?
奈杰尔·弗德斯

1
目的是& {}什么?使用PS5时也可以使用:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Roi Danton

@RoiDanton如何使用stringformatter定义src.zip和dest.zip?
PySaad

161

作为 .NET 4.5开始,PowerShell可以执行以下操作:

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory('foo', 'foo.zip')
[IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar')

对于最后两行,bar并且foo可以替换为您希望文件夹具有的名称,或者使用现有文件夹的名称。foo.zip在这两种情况下,该zip文件都可以另存为或解压缩。


17
这是从.NET 4.5开始的版本。
qJake 2015年

我们可以使用这些命令来增加压缩率吗?像使其超压缩以减小文件大小?
奈杰尔·弗德斯

我有.NET v4.0.30319,V2.0.50727,V1.1.4322,1.0.3705通过从这里安装了虚拟机安装:developer.microsoft.com/en-us/microsoft-edge/tools/vms,而这个作品。 。所以我猜你不需要.NET 4.5
alpha_989

这是现代系统上最实用的解决方案,它会写一个超过2GB的zip文件,而标准的Powershell“ Compress-Archive”将失败。
Shukri Adams

135

如果安装了Java,则可以使用以下jar命令压缩为ZIP归档文件:

jar -cMf targetArchive.zip sourceDirectory

c =创建一个新的存档文件。

M =指定清单文件不应添加到存档中。

f =指示目标文件名。


3
太棒了,谢谢,正是我想要的东西...仅供参考-我不得不在DOS中删除减号...例如jar cMf target.zip sourceDir
mlo55

3
不错,但是您需要安装JDK,而不是JRE。
pdem '16

2
不错的解决方案,可能是最独立的平台解决方案;)
Adrian

YMMD。真棒的想法。节省了我很多时间。
gorefest

3
这是否由“ ... 使用Windows的内置功能”覆盖(我的重点)
Peter Mortensen

84

PowerShell 5.0

Microsoft.PowerShell.Archive您可以使用:

例如:

  • result.zip从整个Test文件夹创建:

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • 提取result.zip指定Test文件夹中的内容:

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    

13
效果很好,谢谢。对于到这里结束的任何人,您都可以powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zip从命令行直接使用而不需要编写脚本(假设您已经安装了Powershell v5,至少可以返回Windows 7)。
Beems

效果很好,如果您打算重新运行它,请添加-Force选项。
罗宾·萨利

1
@Beems,谢谢!但是我认为您反过来使路径/目的地疯狂了吗?
伊平

此方法有效,但是压缩文件的压缩方式与使用Windows资源管理器“发送至->压缩(压缩)文件夹”时的压缩方式不同
。Powershell

Compress-Archive输入文件的最大文件限制为2GB
Sergei Rodionov

37

它并非完全是ZIP,但使用Windows工具压缩文件的唯一方法是:

makecab <source> <dest>.cab

解压缩:

expand <source>.cab <dest>

高级示例(来自ss64.com):

Create a self extracting archive containing movie.mov:
C:\> makecab movie.mov "temp.cab"
C:\> copy /b "%windir%\system32\extrac32.exe"+"temp.cab" "movie.exe"
C:\> del /q /f "temp.cab"

更多信息:makecabexpandmakecab的高级用法



34

使用7-Zip:

邮编:您有一个文件夹foo,并希望将其压缩到myzip.zip

"C:\Program Files\7-Zip\7z.exe" a  -r myzip.zip -w foo -mem=AES256

解压缩:您要将其解压缩(myzip.zip)到当前目录(./

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r

31
请注意以下问题:without the need to install any 3rd party
Roee Gavirel '16

16
@RoeeGavirel 7zip应该是您在任何Windows安装上首先安装的东西之一::P
developerbmw

3
@developerbmw-为什么?B.我正在生产的100台机器上没有7zip。要进行安装,我必须让DevOps将其安装在所有这些计算机以及将添加到群集的所有新计算机上。我宁愿避免。
罗伊·加维雷尔

1
@罗兰德:你能讲宽敞吗?哪里出错了?那会帮助所有人。
Monir

1
@Roland:刚刚检查过,语法运行良好。可能是您尝试使用计算机中不存在的文件夹“ foo”。只是猜一下。
Monir

9

我一直想回答这个确切的问题,根据我的研究,DiryBoy的回答似乎很准确。

我发现compact.exe程序可以压缩文件,但不能创建高度压缩的文件(或文件集)。它类似于在Windows中右键单击驱动器号或分区时所获得的选项。您可以选择进行清理(删除临时文件等)以及压缩文件。压缩文件仍可访问,但仅被压缩以在驱动器上创建空间不足的空间。

我还发现我的计算机上确实有compress.exe。它不是大多数Windows计算机上的本机,而是2003资源工具包的一部分。它的确压缩了各种压缩文件,但实际上与Windows安装盘中的文件更相似(下划线是文件扩展名或名称的最后一个字符)。然后extract.exe命令提取这些文件。

但是,口头禅是,如果可以通过GUI本机完成,那么很可能有一种方法可以通过批处理,.vbs或命令行中的某些其他类型的脚本来完成。由于Windows具有创建zip文件的“发送至”选项,因此我知道必须有一种通过命令行执行此操作的方法,并且发现了一些选项。

这是一个很棒的链接,显示了如何使用Windows本机命令压缩文件。

/superuser/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili

我用一个包含多个嵌套文件和文件夹的目录对其进行了测试,它运行良好。只需遵循命令行格式即可。

我也找到了一种通过命令行解压缩文件的方法。一种方法是,打开浏览器窗口,显示压缩文件的内容。其中一些还使用Java,而Java不一定是Windows固有的,却是如此普遍,以至于看起来几乎是这样。

/superuser/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

如何使用命令行解压缩文件?



8

您可以使用包装在BAT文件中的VBScript脚本。此代码适用于相对路径。

不需要任何第三方工具或依赖项。只需设置SOURCEDIROUTPUTZIP

档案名称:ZipUp.bat

echo Set fso = CreateObject("Scripting.FileSystemObject") > _zipup.vbs
echo InputFolder = fso.GetAbsolutePathName(WScript.Arguments.Item(0)) >> _zipup.vbs
echo ZipFile = fso.GetAbsolutePathName(WScript.Arguments.Item(1)) >> _zipup.vbs

' Create empty ZIP file.
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipup.vbs

echo Set objShell = CreateObject("Shell.Application") >> _zipup.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipup.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipup.vbs

echo ' Keep script waiting until compression is done
echo Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count >> _zipup.vbs
echo     WScript.Sleep 200 >> _zipup.vbs
echo Loop >> _zipup.vbs

CScript  _zipup.vbs  %SOURCEDIR%  %OUTPUTZIP%

del _zipup.vbs

用法示例

SET SOURCEDIR=C:\Some\Path
SET OUTPUTZIP=C:\Archive.zip
CALL ZipUp

另外,您也可以通过更换线参数化这个文件CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%CScript _zipup.vbs %1 %2,在这种情况下,可以通过简单地调用更加容易叫从CALL ZipUp C:\Source\Dir C:\Archive.zip


创建初始zip文件的行需要转义,否则不会在脚本中结束。

是的,这是要走的路(就像在超级用户问题中一样)。
彼得·莫滕森

我添加了一个正确的转义版本作为答案。
fsteff

5

我对所有这些解决方案都有疑问。

它们并不完全相同,而且它们创建的文件与RMB --> send to --> compressed (zipped) folder从同一源文件夹制作的文件相比,它们的大小略有不同。我拥有的最接近的大小差异是300 KB差异(脚本>手册),其使用方式为:

powershell Compress-Archive -Path C:\sourceFolder -CompressionLevel Fastest -DestinationPath C:\destinationArchive.zip

(请注意-CompressionLevel有三个可能的值:Fastest,NoCompression&Optimal(默认:Optimal))

我想制作一个.bat文件,该文件应自动将正在处理的WordPress插件文件夹压缩为.zip存档,以便将其上载到WordPress网站并测试该插件。

但是由于某种原因,它不适用于任何这些自动压缩,但是可以用于手动的RMB压缩,我发现这真的很奇怪。

脚本生成的.zip文件实际上将WordPress插件破坏到无法激活的地步,也无法从WordPress内部删除它们。我必须通过SSH进入服务器的“背面”,并手动删除上传的插件文件本身。手动生成的人民币文件可以正常工作。


什么是“ wbr”“ RMB”
彼得·莫滕森

RMB =鼠标右键。<wbr> =一个HTML标记,它向浏览器指示“ Word BReak机会”(已删除,因为它不起作用)。
塞巴斯蒂安·诺尔

4

如果您需要在脚本中执行此操作,那么最好的方法是使用Java。假设bin目录在您的路径中(在大多数情况下),您可以使用命令行:

jar xf test.zip

如果Java不在您的路径中,请直接引用它:

C:\Java\jdk1.6.0_03\bin>jar xf test.zip

3

开源是您的朋友:-)

这是解压缩文件http : //gnuwin32.sourceforge.net/packages/unzip.htm

也有一个ZIP命令:http : //gnuwin32.sourceforge.net/packages/zip.htm

二进制文件下载就足够了。


在Windows 8上,它将引发错误:bzip2.dll丢失。
2015年

1
@Doug它说bzip2是页面上的必需条件,并且具有下载链接
山姆

11
最初的问题是如何使用标准的内置Windows命令。此外,不希望要求用户安装各种第三方解决方案,因为您自己的工具或解决方案现在仅限于对计算机具有管理权限的用户,或者不关心系统上越来越少的依赖关系的用户。 。开源可能是您的朋友,但是要求您安装其他开源软件包,需要您安装其他开源软件包等的开源软件包绝对不是您的朋友。
Steve Hollasch '16

SourceForge被我的工作的防火墙策略阻止了:-(
SnookerC '16

1
这仍然使用第三方sotware
ДеянДобромиров

3

这是@ PodTech.io提供的答案的更新版本。

此版本的批处理文件中正确转义了所有vbs代码。它还创建到一个子例程中,可以在批处理脚本中的任何位置用单行调用它:

:: === Main code:

call :ZipUp "C:\Some\Path" "C:\Archive.zip"


:: === SubRoutines:

:ZipUp
::Arguments: Source_folder, destination_zip
(
    echo:Set fso = CreateObject^("Scripting.FileSystemObject"^)
    echo:InputFolder = fso.GetAbsolutePathName^(WScript.Arguments.Item^(0^)^)
    echo:ZipFile = fso.GetAbsolutePathName^(WScript.Arguments.Item^(1^)^)
    echo:
    echo:' Create empty ZIP file.
    echo:CreateObject^("Scripting.FileSystemObject"^).CreateTextFile^(ZipFile, True^).Write "PK" ^& Chr^(5^) ^& Chr^(6^) ^& String^(18, vbNullChar^)
    echo:
    echo:Set objShell = CreateObject^("Shell.Application"^)
    echo:Set source = objShell.NameSpace^(InputFolder^).Items
    echo:objShell.NameSpace^(ZipFile^).CopyHere^(source^)
    echo:
    echo:' Keep script waiting until compression is done
    echo:Do Until objShell.NameSpace^( ZipFile ^).Items.Count = objShell.NameSpace^( InputFolder ^).Items.Count
    echo:    WScript.Sleep 200
    echo:Loop
)>_zipup.vbs
CScript //Nologo _zipup.vbs "%~1" "%~2"
del _zipup.vbs
goto :eof

2

您说您要在没有第三方软件的情况下执行此操作。我不确定您是否会考虑使用.NET“第三方”软件。

但是您可以在.NET中创建自己的命令行实用程序。它不需要多于几行代码。

ZipFile类


0

加上@Jason Duffett的答案及其评论,以下是一个脚本,该脚本可从用户获取输入和输出(分别为文件名和目录名):

@echo off
set input=%1
set output=%2
powershell.exe "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('%input%', '%output%');"

用法:

unzip.bat path\to\file.zip path\to\output\directory

-4

要压缩文件:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9最大压缩
  • -m成功压缩后删除原始文件
  • -o将zip文件的修改日期设置为与原始文件相同
  • 太糟糕了,必须给它提供所需的zip文件的名称,而不是仅将.zip扩展名添加到要压缩的文件的名称中

4
两件事:(1)Windows没有提供“ zip”,因此它可能是您的第三方。正如我提到的问题,我无法安装第三方。(2)之所以需要提供所需的名称,是因为通过压缩方式创建和归档文件(例如文件中的文件夹),并且在那里可能存在多个文件。
Roee Gavirel 2015年

@RoeeGavirel在服务器中,我发现zip命令行实用程序没有安装winzip GUI工具,因此我猜想Windows附带了裸露的CLI工具。另一方面,如果未传递所需名称,则Unix / Linux压缩实用程序(例如compress,bzip2和gzip)会创建一个压缩文件,其名称与原始文件相同,并带有扩展名(.Z,.bz2或.gz)。压缩文件。
TulainsCórdova2015年

-4

您可以使用Expand命令解压缩压缩的或本地压缩的Windows文件,例如

expand MyFile.zip myFile

9
我尝试过,但是它将MyFile.zip复制到myFile文件夹,
fhnaseer 2014年

这帮助我C:\>展开/?
snow6oy 2014年

11
Expand仅适用于.cab文件,不适用于zip文件。
рüффп

2
同上其他评论。Expand file.zip file只是将zip复制到另一个没有扩展名的文件中。它不会将ZIP解压缩到文件夹中。
戴夫·马利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.