在 Windows 中,您可以通过以下方式压缩一些文件
右键单击→发送到→压缩(压缩)文件夹
并通过双击.zip
文件解压缩并提取文件。
有没有办法从脚本(.bat 文件)应用这些功能而无需安装任何第三方软件?
在 Windows 中,您可以通过以下方式压缩一些文件
右键单击→发送到→压缩(压缩)文件夹
并通过双击.zip
文件解压缩并提取文件。
有没有办法从脚本(.bat 文件)应用这些功能而无需安装任何第三方软件?
要扩展 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。
如果您安装了 Java,则可以使用以下jar
命令压缩为 ZIP 存档:
jar -cMf targetArchive.zip sourceDirectory
c = 创建一个新的存档文件。
M = 指定不应将清单文件添加到存档中。
f = 表示目标文件名。
您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
早在 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
它不完全是 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"
更多信息:makecab、expand、makecab 高级用途
使用 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
您可以使用包装在 BAT 文件中的 VBScript 脚本。此代码适用于相对路径。
不需要任何第三方工具或依赖项。只需设置SOURCEDIR
和OUTPUTZIP
。
文件名: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
.
我一直在寻求回答这个确切的问题,根据我的研究,DiryBoy 的回答似乎是准确的。
我发现 compact.exe 程序会压缩文件,但不会创建高度压缩的文件(或文件集)。它类似于您在 Windows 中右键单击驱动器号或分区时获得的选项。您可以选择进行清理(删除临时文件等)以及压缩文件。压缩文件仍然可以访问,但只是被压缩以在空间不足的驱动器上创建空间。
我还发现了我的计算机上碰巧有的 compress.exe。它不是在大多数 Windows 机器上原生的,并且是 2003 资源工具包的一部分。它确实会生成某种压缩文件,但它实际上更类似于 Windows 安装盘中的文件(下划线作为文件扩展名或名称的最后一个字符)。extract.exe 命令提取这些文件。
然而,口头禅是,如果它可以通过 GUI 本地完成,那么很可能有一种方法可以通过批处理、.vbs 或命令行中的其他类型的脚本来完成。由于 windows 有“发送到”选项来创建一个 zip 文件,我知道必须有一种方法可以通过命令行来完成,我找到了一些选项。
这是一个很棒的链接,展示了如何使用 Windows 本机命令压缩文件。
我使用包含多个嵌套文件和文件夹的目录对其进行了测试,并且效果很好。只需按照命令行的格式即可。
还有一种方法可以通过我发现的命令行解压缩文件。一种方法是打开一个资源管理器窗口,显示压缩文件的内容。其中一些还使用 Java,它不一定是 Windows 原生的,但很常见,几乎看起来如此。
如果您需要将此作为脚本的一部分,那么最好的方法是使用 Java。假设 bin 目录在您的路径中(在大多数情况下),您可以使用命令行:
jar xf test.zip
如果 Java 不在您的路径上,请直接引用它:
C:\Java\jdk1.6.0_03\bin>jar xf test.zip
我对所有这些解决方案都有疑问。
它们并不完全相同,并且它们都创建的文件与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文件工作正常。
这是@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
开源是你的朋友 :-)
这是解压缩:http : //gnuwin32.sourceforge.net/packages/unzip.htm
还有一个 ZIP 命令:http: //gnuwin32.sourceforge.net/packages/zip.htm
二进制文件下载就足够了。
使用 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 是 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(和 powershell)提供了很多压缩和解压缩文件的方法。最直接的是使用 gzip 流。该脚本称为gzipjs.bat:
::zip
call gzipjs.bat -c my.file my.zip
::unzip
call gzipjs.bat -u my.zip my.file
较新的 Windows 版本包括 tar.exe。
tar.exe 可以在 cmd 或 windows 批处理文件中使用。
//Compress a folder:
tar -caf aa.zip c:\aa
添加@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
这个对我有用(2021 年):
tar -xf test.zip
这将在当前目录中解压缩测试。
我找到了一种用批处理文件解压缩 zip 文件的方法:
@echo off
::unziper
set /p zip=zip:
powershell -Command "Expand-Archive %zip%"
echo done
pause
如果有人需要,我会发布这个。你为什么要编辑我的答案?
正如@Noam Manos 所回答的那样,我们可以通过在.bashrc
文件中使用别名来进一步改进压缩:
alias zip='jar -cMf'
然后命令(在 bash 终端中)将是
zip target.zip dir1 dir2
注意:您应该在 windows 中安装和设置 java 和 git bash 才能正常工作。