我有一个输出文本文件的批处理文件。我认为也可以将其压缩。

这将在不受控制的环境中使用,因此我无法对诸如7之类的第三方软件产品的存在做出假设。 -Zip等。这需要使用Windows现在内置的功能来压缩文件。

评论

您可以利用Powershell或WSH脚本吗?这可能是从命令行使用Windows内置zip处理的唯一方法。否则,正如Molly指出的那样,您需要一个第三方工具。

这样您就可以向某人发送批处理文件,而不能向他发送一些微小的静态链接gzip.exe?

OP的问题是一个很好的问题(尽管@quackquixote提出了奇怪的指控)。由于Windows确实是在SendTo下单击提供的,因此在BAT文件中应该有一个可用的命令。因此,即使答案为“否”并且必须(荒唐地)诉诸使用可能等效或不等效的第三方工具,这也是一个好问题。

这是Tomas的链接,具有写得很好的脚本来压缩文件夹的内容。要使其工作,只需将脚本复制到批处理文件中,然后通过指定要压缩的文件夹(源)执行该脚本即可。无需提及目标目录,因为该目录在脚本中默认为桌面(“%USERPROFILE%\ Desktop”)

最简单的方法是在cmd提示符下:powershell.exe压缩存档file-to-zip.txt zippedfile.zip(也适用于文件夹)

#1 楼

这是一个全批处理文件解决方案(是我其他回答的一个变体),它将解压缩名为c:\ue_english.txt的文件并将其放入C:\someArchive.zip中:

set FILETOZIP=c:\ue_english.txt

set TEMPDIR=C:\temp738
rmdir %TEMPDIR%
mkdir %TEMPDIR%
xcopy /s %FILETOZIP% %TEMPDIR%

echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo wScript.Sleep 2000 >> _zipIt.vbs

CScript  _zipIt.vbs  %TEMPDIR%  C:\someArchive.zip

pause


需要写访问权限存储在TEMPDIR中的文件夹的父级。由于驱动器C的根目录通常不是这种情况,因此必须更改TEMPDIR

还需要对.bat脚本所在的文件夹进行写访问(因为它在此处生成文件)。

此外,请注意,压缩文件的文件扩展名必须为.zip。尝试使用其他扩展名可能会导致脚本错误。而是生成.zip文件并将其重命名。

评论


@quack我一直在等待一些我不知道的晦涩命令。我可以看到,如果不存在这样一个困难的要求,那并不意味着要把任何人赶出去。

–亚伦·布什
10 Mar 2 '10 at 13:56



@PeterMortensen:看看用Powershell可以简化多少有趣或不有趣。这是一个5行示例,但也存在一个可从Pscx下载的write-zip cmdlet。

–塔玛拉·维斯曼(Tamara Wijsman)
2011-11-29 13:54



我使用zip.exe和cywin1.dll(3mb)来满足ZIP的需要,用法仅一行...从使用某些批处理代码的zip本身开始。我知道可以使用与argv banphp编译的php并将文件传递给它。听起来不错。 “ Windows命令行中的zip”是一部古老的科幻电影,对不对?

– m3nda
2013年12月10日6:59



为什么我们必须使用一个临时文件夹TEMPDIR?我认为您的意图是通过文件夹来包装文件FILETOZIP吧?

– Nam G VU
14-10-15在2:11



@Peter Mortensen,我知道这是一个老话题,这几乎是我想要的。是否可以将一个大文件压缩为较小的块?

–JohnG
16年5月18日在16:21

#2 楼

无需安装任何其他软件即可压缩文件(我已经测试过)。解决方案是:

在命令行窗口中运行此命令,以创建一个名为C:\someArchive.zip的ZIP文件,其中包含文件夹C:\test3中的所有文件:

CScript  zip.vbs  C:\test3  C:\someArchive.zip


文件zip.vbs包含以下内容:

' Get command-line arguments.
Set objArgs = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
InputFolder = FS.GetAbsolutePathName(objArgs(0))
ZipFile = FS.GetAbsolutePathName(objArgs(1))

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

Set objShell = CreateObject("Shell.Application")

Set source = objShell.NameSpace(InputFolder).Items

objShell.NameSpace(ZipFile).CopyHere(source)

' Required to let the ZIP command execute
' If this script randomly fails or the ZIP file is not complete,
' just increase to more than 2 seconds
wScript.Sleep 2000


我尚未对其包含空格的路径和文件名进行测试。如果在命令行参数周围加上引号
,则可能会起作用。


工作原理:公开了Windows(Windows XP和更高版本)中的内置zip功能。通过Windows外壳程序explorer.exe中的COM接口进行操作-这是“ Shell.Application”部分。可以从VBScript脚本使用此COM接口,因为这样的脚本可以访问COM组件。为了使脚本完全独立,它会创建一个空的ZIP文件以开始使用(也可以创建一个空的ZIP文件并将其与VBScript脚本一起复制到目标系统)。

VBScript具有自Windows 98以来,默认情况下已在Microsoft Windows的每个桌面版本中安装了Windows。

CScript.exe是Windows Script Host的一部分。
Windows Script Host在Windows 98及更高版本上默认分发并安装。 Windows。如果安装了Internet Explorer 5(或更高版本),则也会安装它。

评论


+1好的解决方案将“运行”,但出于其他一些未列出的原因,我选择了BAT。所以我更喜欢BAT解决方案。

–亚伦·布什
2010-2-22在13:30



@Aaron Bush:该脚本和Beaner都提供了一个命令,该命令可根据要求使用Windows内置函数在命令行上压缩文件。您可以像其他命令一样将该命令添加到批处理文件中。

–嘎嘎吉x德
2010-2-22在23:24



请注意,传入的路径必须是绝对路径,而不是相对路径。我还必须在这里使用答案中的技术:stackoverflow.com/q/1645843/99640

–查克·威尔伯(Chuck Wilbur)
2012年6月27日在21:08

路径必须是绝对的,并且似乎随机失败:(

– Kixorz
14年2月13日在20:33

应该选择它作为答案。

–马歇尔公爵שלום
14年3月14日在17:48

#3 楼

如果您愿意使用PowerShell,则可以在.NET 2.0中使用zip功能(PowerShell是.NET)。这是Mike Hodnick的示例(来源):

########################################################
# out-zip.ps1
#
# Usage:
#    To zip up some files:
#       ls c:\source\*.txt | out-zip c:\target\archive.zip $_
#
#    To zip up a folder:
#       gi c:\source | out-zip c:\target\archive.zip $_
########################################################

$path = $args[0]
$files = $input

if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

if (-not (test-path $path)) { 
  set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 

$ZipFile = (new-object -com shell.application).NameSpace($path) 
$files | foreach {$zipfile.CopyHere($_.fullname)}


评论


这与其他答案中的CScript代码基本相同。不使用.NET功能(而且.NET始终不支持ZIP)。我怀疑这可能对计时问题也很敏感。

–罗伯特·施密特(Robert Schmidt)
2014年2月25日在8:14



.NET System.IO.Compression.ZipFile类在版本4.5中添加。

–混凝土塘鹅
2014年11月24日在8:00

#4 楼

Windows 10内部版本17063或更高版本与tar.exe捆绑在一起,后者可以从命令行使用ZIP文件。

tar.exe -xf archive.zip


或创建存档:

tar.exe -cf Test.zip Test


评论


创建时仅使用-a选项更正。否则,它假定一个普通的tar存档。

– Keilaron
20年7月17日在4:41

#5 楼

您可以通过轮询压缩对话框窗口的存在来消除压缩期间超时的风险。此方法还可以处理用户取消压缩窗口的操作。

objShell.NameSpace(ZipFile).CopyHere(source)

' Wait for compression window to open
set scriptShell = CreateObject("Wscript.Shell")
Do While scriptShell.AppActivate("Compressing...") = FALSE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop  

' Wait for compression to complete before exiting script
Do While scriptShell.AppActivate("Compressing...") = TRUE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop


评论


+1。那些代码猴子风格的“ .Sleep(任何)”使我恶心。

– ivan_pozdeev
2013年6月25日14:30



如果我使用上述逻辑运行vbs进行等待,如果通过计划任务(没有用户实际登录的话)启动该vbs,将如何处理。

– Wes
2013年6月27日22:05

#6 楼

如果能够安装资源工具包工具,则将找到一个名为COMPRESS的命令行工具,该工具可以创建压缩的存档文件,例如zip。

Microsoft (R) File Compression Utility  Version 5.00.2134.1
Copyright (C) Microsoft Corp. 1990-1999.  All rights reserved.

Compresses one or more files.

COMPRESS [-r] [-d] [-z] Source Destination
COMPRESS -r [-d] [-z] Source [Destination]

  -r            Rename compressed files.
  -d            Update compressed files only if out of date.
  -zx           LZX compression.
  -z            MS-ZIP compression.
  -zq[n]        Quantum compression and optional level
                (in range 1-7, default is 4).
  Source        Source file specification.  Wildcards may be used.
  Destination   Destination file | path specification.
                Destination may be a directory.
                If Source is multiple files and -r is not specified,
                Destination must be a directory.


评论


+1并不能真正解决问题,但还是很了解。

–亚伦·布什
2010-2-22在13:28

#7 楼

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


评论


正是我想要的..但​​是它确实给了我一个错误“缺少空的Zip文件”

–声波灵魂
2014年4月3日在21:25



出于某种原因,这永远不会增加,如果我在循环内打印objShell.NameSpace(ZipFile).Items.Count,即使创建了zip文件并且其中包含预期的内容,它也始终为0 ...

–汤姆·尼科尔斯(Thom Nichols)
15年4月27日在20:20

#8 楼

具有简化代码的多个文件/目录。

cscript zip.vbs target.zip sourceFile1 sourceDir2 ... sourceObjN


zip.vbs文件

Set objArgs = WScript.Arguments
ZipFile = objArgs(0)

' Create empty ZIP file and open for adding
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set zip = CreateObject("Shell.Application").NameSpace(ZipFile)

' Add all files/directories to the .zip file
For i = 1 To objArgs.count-1
  zip.CopyHere(objArgs(i))
  WScript.Sleep 10000 'REQUIRED!! (Depending on file/dir size)
Next


#9 楼

这是已接受答案的变异。我一次要对多达数千个文件执行大量的自动化任务,因此我不能只睡2秒钟,也不在乎。我在此处收集了解决方法,这也与JiříKočara的回答类似。

这将导致目标文件夹每200毫秒ping一次目标文件夹,这大约与Microsoft所说的检查文件系统一样快。更新。

Set parameters = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
SourceDir = FS.GetAbsolutePathName(parameters(0))
ZipFile = FS.GetAbsolutePathName(parameters(1))
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set shell = CreateObject("Shell.Application")
Set source_objects = shell.NameSpace(SourceDir).Items
Set ZipDest = shell.NameSpace(ZipFile)
Count=ZipDest.Items().Count
shell.NameSpace(ZipFile).CopyHere(source_objects)
Do While Count = ZipDest.Items().Count
    wScript.Sleep 200
Loop


#10 楼

如果在Windows 8或Windows Server 2012上具有PowerShell和.NET 4.5,则可以执行以下操作:
-directory <directory to zip up> -name <zip name>):

< pre class =“ lang-powershell prettyprint-override”> param ( [string]$directory, [string]$name ) Add-Type -Assembly System.IO.Compression.FileSystem [System.IO.Compression.ZipFile]::CreateFromDirectory($directory, $name, [System.IO.Compression.CompressionLevel]::Optimal, $false)

zip.bat(如果需要帮助程序来调用PowerShell,则目录为第一个参数,ZIP名称为第二个) ):

 @Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"
 


#11 楼

这是我尝试总结Windows中用于压缩和解压缩的内置功能-如何在不使用任何外部工具的情况下使用批处理文件压缩(/ zip)和解压缩(/ unzip)文件和文件夹? -具有一些适用于几乎所有Windows机器的解决方案。

关于shell.application和WSH,我更喜欢JScript,因为它允许混合批处理/ JScript文件(带有。 bat扩展名),不需要临时文件。我已经将解压缩和zip功能放在一个文件中,再加上其他一些功能。

#12 楼

为此(通过PowerShell v5.0 +)有一个简单的cmd.exe命令。

要压缩:

powershell Compress-Archive -LiteralPath 'C:\mypath\testfile.txt' -DestinationPath "C:\mypath\Test.zip"


要解压缩:

powershell Expand-Archive -LiteralPath "C:\mypath\Test.Zip" -DestinationPath "C:\mypath" -Force


来源:


压缩存档
扩展存档

>特别感谢@Ramhound。

评论


请不要对多个问题发布相同的答案。如果相同的信息确实回答了两个问题,则应关闭一个问题(通常是较新的问题),作为另一个问题的重复。您可以通过投票将其关闭作为重复项来表明这一点,或者,如果您没有足够的声誉,可以举一个标志来表明它是重复项。否则,请针对这个问题量身定制答案,而不仅仅是在多个地方粘贴相同的答案。

–DavidPostill♦
20-4-21在21:49

谁是“ @Ramhound”?你能提供一个链接吗?

– Peter Mortensen
20年6月7日在11:36

他们是某个地方的堆栈交换用户。我没有链接。

–拨浪鼓
20年6月10日,0:07

#13 楼

Windows命令行现在提供COMPACT命令,据我所知,它是Windows的本机命令。除非我错过了一些东西,否则应该可以满足要求。

评论


XP自XP以来就存在,它是管理NTFS压缩的工具

–霍赫斯塔普勒(Der Hochstapler)
13年5月31日在20:06



@ user228211您的答案非常适合“使用Windows内置zip功能”这个问题。由于简单易行且直接匹配问题,因此它应该是最佳答案之一。不确定为什么人们会投票否决????

– LMSingh
20-2-28在22:31

@LMSingh您是机器人吗?因为NTFS与zip无关。

– Martheen Cahya Paulo
20 Mar 13 '20 at 9:56

@MartheenCahyaPaulo。去查看我的个人资料。去检查我的答案。它看起来像个机器人吗? PS:仍然对低调投票感到困惑,并对像您这样的经验丰富的用户在进行人身攻击之前没有做任何研究或理解问题(或我的回答)感到困惑。非常不幸

– LMSingh
20-3-19在2:20



@LMSingh:您对COMPACT的解释是什么?它说:“显示或更改NTFS分区上文件的压缩。”压缩部件是否暴露给用户?还是被隐藏(例如,像加密驱动器上的加密一样)?这不是使文件占用硬盘上更少的物理空间的一种方法(没有获取物理位的方法)吗?可以提供一个可以生成ZIP文件的示例吗?

– Peter Mortensen
20 Jun 7'11:22