您能否仅使用 Windows 的内置压缩文件功能从命令提示符压缩文件?

Aar*_*ush 125 windows zip batch command-line

我有一个输出文本文件的批处理文件。我想如果我也能把它拉上拉链就好了。

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

Pet*_*sen 93

这是一个全批处理文件解决方案(我的其他答案的变体),它将压缩一个名为的文件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
Run Code Online (Sandbox Code Playgroud)

需要对存储在TEMPDIR. 由于通常情况并非如此,驱动器 C 的根目录TEMPDIR可能需要更改。

.bat脚本所在的文件夹也需要写访问权限(因为它会在那里生成一个文件)。

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

  • @quack 我一直在坚持,希望得到一些我不知道的晦涩命令。我可以理解你会如何发现一个困难的要求,如果一个不存在,并不意味着把任何人排除在外。 (3认同)

Pet*_*sen 41

可能的zip文件,无需安装任何额外的软件(我测试)。解决办法是:

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

CScript  zip.vbs  C:\test3  C:\someArchive.zip
Run Code Online (Sandbox Code Playgroud)

其中文件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
Run Code Online (Sandbox Code Playgroud)

我还没有针对包含空格的路径和文件名测试过它。如果在命令行参数周围加上引号,它可能会起作用。


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

自 Windows 98 以来,Microsoft Windows 的每个桌面版本都默认安装了 VBScript。

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

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

Bea*_*ner 12

如果您愿意使用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)}
Run Code Online (Sandbox Code Playgroud)

  • .NET System.IO.Compression.ZipFile 类是在 4.5 版中添加的。 (3认同)

ven*_*mus 11

Windows 10 build 17063 或更高版本与 tar.exe 捆绑在一起,它能够从命令行处理 ZIP 文件。

tar.exe -xf archive.zip
Run Code Online (Sandbox Code Playgroud)

或者创建一个 ZIP 档案:

tar.exe -a -cf Test.zip Test
Run Code Online (Sandbox Code Playgroud)

  • 开关记录在这里:https://www.freebsd.org/cgi/man.cgi?query=bsdtar&sektion=1 .. -a 代表“自动压缩”,其中格式是从扩展名推导出来的 (5认同)
  • 仅在创建时使用 `-a` 选项更正。否则,它假定一个普通的 tar 存档。 (3认同)
  • 哇..这有效,但据我所知没有任何地方记录 (2认同)

小智 7

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

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
Run Code Online (Sandbox Code Playgroud)

  • 如果我正在运行具有上述等待逻辑的 vbs,如果通过计划任务启动(没有用户实际登录),将如何处理。 (2认同)

cow*_*tor 7

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

压缩:

powershell Compress-Archive -LiteralPath 'C:\mypath\testfile.txt' -DestinationPath "C:\mypath\Test.zip"
Run Code Online (Sandbox Code Playgroud)

解压缩:

powershell Expand-Archive -LiteralPath "C:\mypath\Test.Zip" -DestinationPath "C:\mypath" -Force
Run Code Online (Sandbox Code Playgroud)

资料来源:

特别感谢@Ramhound。


cow*_*god 5

如果您能够安装Resource Kit Tools,您将找到一个名为 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.
Run Code Online (Sandbox Code Playgroud)

  • +1 并不能真正解决问题,但还是很高兴知道。 (4认同)