320

在 Windows 中,您可以通过以下方式压缩一些文件

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

并通过双击.zip文件解压缩并提取文件。

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

4

19 回答 19

189

要扩展 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。

于 2014-11-10T11:45:59.900 回答
145

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

jar -cMf targetArchive.zip sourceDirectory

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

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

f = 表示目标文件名。

于 2015-04-26T14:47:58.980 回答
95

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
    
于 2016-10-24T22:00:42.570 回答
87

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

有关执行此操作的一些 VBS 方法,请参见此链接。 https://superuser.com/questions/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

于 2013-07-09T10:43:20.043 回答
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 高级用途

于 2015-05-29T01:43:08.250 回答
32

使用 7-Zip:

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
于 2016-01-25T13:40:30.547 回答
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.

于 2016-02-06T00:01:58.143 回答
7

我一直在寻求回答这个确切的问题,根据我的研究,DiryBoy 的回答似乎是准确的。

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

我还发现了我的计算机上碰巧有的 compress.exe。它不是在大多数 Windows 机器上原生的,并且是 2003 资源工具包的一部分。它确实会生成某种压缩文件,但它实际上更类似于 Windows 安装盘中的文件(下划线作为文件扩展名或名称的最后一个字符)。extract.exe 命令提取这些文件。

然而,口头禅是,如果它可以通过 GUI 本地完成,那么很可能有一种方法可以通过批处理、.vbs 或命令行中的其他类型的脚本来完成。由于 windows 有“发送到”选项来创建一个 zip 文件,我知道必须有一种方法可以通过命令行来完成,我找到了一些选项。

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

https://superuser.com/questions/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili

我使用包含多个嵌套文件和文件夹的目录对其进行了测试,并且效果很好。只需按照命令行的格式即可。

还有一种方法可以通过我发现的命令行解压缩文件。一种方法是打开一个资源管理器窗口,显示压缩文件的内容。其中一些还使用 Java,它不一定是 Windows 原生的,但很常见,几乎看起来如此。

https://superuser.com/questions/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

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

于 2013-11-15T04:16:32.277 回答
5

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

jar xf test.zip

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

C:\Java\jdk1.6.0_03\bin>jar xf test.zip
于 2014-11-24T16:27:36.650 回答
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 连接到服务器的“后端”并手动删除上传的插件文件。而手动生成的RMB文件工作正常。

于 2019-08-07T07:18:32.013 回答
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
于 2019-09-19T14:47:26.433 回答
2

开源是你的朋友 :-)

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

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

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

于 2015-01-21T22:11:17.333 回答
2

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

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

ZipFile 类

于 2015-05-22T16:51:59.600 回答
2

Shell.Application

使用 Shell.Application 您可以模拟 explorer.exe 压缩文件和文件夹的方式 该脚本称为zipjs.bat

:: unzip content of a zip to given folder.content of the zip will be not preserved (-keep no).Destination will be not overwritten (-force no)
call zipjs.bat unzip -source C:\myDir\myZip.zip -destination C:\MyDir -keep no -force no

:: lists content of a zip file and full paths will be printed (-flat yes)
call zipjs.bat list -source C:\myZip.zip\inZipDir -flat yes

:: lists content of a zip file and the content will be list as a tree (-flat no)
call zipjs.bat list -source C:\myZip.zip -flat no

:: prints uncompressed size in bytes
zipjs.bat getSize -source C:\myZip.zip

:: zips content of folder without the folder itself
call zipjs.bat zipDirItems -source C:\myDir\ -destination C:\MyZip.zip -keep yes -force no

:: zips file or a folder (with the folder itslelf)
call zipjs.bat zipItem -source C:\myDir\myFile.txt -destination C:\MyZip.zip -keep yes -force no

:: unzips only part of the zip with given path inside
call zipjs.bat unZipItem -source C:\myDir\myZip.zip\InzipDir\InzipFile -destination C:\OtherDir -keep no -force yes
call zipjs.bat unZipItem -source C:\myDir\myZip.zip\InzipDir -destination C:\OtherDir 

:: adds content to a zip file
call zipjs.bat addToZip -source C:\some_file -destination C:\myDir\myZip.zip\InzipDir -keep no
call zipjs.bat addToZip -source  C:\some_file -destination C:\myDir\myZip.zip

MAKECAB

Makecab 是 windows 自带的默认压缩工具。虽然它可以使用不同的压缩算法(包括 zip),但文件格式始终是一个.cab文件。通过一些扩展,它也可以在 linux 机器上使用。

压缩文件:

makecab file.txt "file.cab"

压缩整个文件夹需要更多的工作。这里一个目录是用cabDir.bat压缩的:

call cabDir.bat ./myDir compressedDir.cab

使用命令解压缩相当容易expand

EXPAND cabfile -F:* .

更骇人听闻的方法是使用 extrac32 命令创建自解压可执行文件:

copy /b "%windir%\system32\extrac32.exe"+"mycab.cab" "expandable.exe"
call expandable.exe

柏油

对于 Windows 的 build 17063,我们有 tar 命令:

::compress directory
tar -cvf archive.tar c:\my_dir
::extract to dir
tar -xvf archive.tar.gz -C c:\data

.NET 工具

.net(和 powershell)提供了很多压缩和解压缩文件的方法。最直接的是使用 gzip 流。该脚本称为gzipjs.bat

::zip
call gzipjs.bat -c my.file my.zip
::unzip
call gzipjs.bat -u my.zip my.file
于 2020-11-09T13:37:55.080 回答
2

较新的 Windows 版本包括 tar.exe。
tar.exe 可以在 cmd 或 windows 批处理文件中使用。

//Compress a folder:
tar -caf aa.zip c:\aa
于 2021-04-18T13:16:56.817 回答
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
于 2020-03-10T21:04:06.930 回答
0

这个对我有用(2021 年):

tar -xf test.zip

这将在当前目录中解压缩测试。

于 2021-02-21T12:10:27.260 回答
0

我找到了一种用批处理文件解压缩 zip 文件的方法:

@echo off
::unziper
set /p zip=zip:
powershell -Command "Expand-Archive %zip%"
echo done
pause

如果有人需要,我会发布这个。你为什么要编辑我的答案?

于 2021-10-15T12:45:33.027 回答
0

正如@Noam Manos 所回答的那样,我们可以通过在.bashrc 文件中使用别名来进一步改进压缩:

alias zip='jar -cMf'

然后命令(在 bash 终端中)将是

zip target.zip dir1 dir2

注意:您应该在 windows 中安装和设置 java 和 git bash 才能正常工作。

于 2022-01-20T05:53:54.700 回答