我有一个输出文本文件的批处理文件。我认为如果也可以将其拉上拉链会很好。
这将在不受控制的环境中使用,因此我无法对第三方软件产品(例如7-Zip等)的存在做出假设。这需要使用Windows现在内置的功能来压缩文件。
powershell.exe Compress-Archive file-to-zip.txt zippedfile.zip
它也适用于文件夹)
我有一个输出文本文件的批处理文件。我认为如果也可以将其拉上拉链会很好。
这将在不受控制的环境中使用,因此我无法对第三方软件产品(例如7-Zip等)的存在做出假设。这需要使用Windows现在内置的功能来压缩文件。
powershell.exe Compress-Archive file-to-zip.txt zippedfile.zip
它也适用于文件夹)
Answers:
这是一个全批处理文件解决方案(是我其他回答的一个变体),它将压缩名为的文件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
。因为通常不必TEMPDIR
更改驱动器C的根目录。
.bat
脚本所在的文件夹也需要写访问权限(因为脚本会在其中生成文件)。
另外,请注意,压缩文件的文件扩展名必须为.zip
。尝试使用其他扩展名可能会导致脚本错误。而是,生成.zip
文件并重命名。
TEMPDIR
?我认为您的意图是FILETOZIP
通过文件夹包装文件,对吗?
这是可能的zip文件,无需安装任何额外的软件(我测试)。解决方案是:
在命令行窗口中运行此命令,以创建一个名为ZIP文件,该文件C:\someArchive.zip
包含folder中的所有文件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脚本一起复制到目标系统中)。
自Windows 98以来,默认情况下已在Microsoft Windows的每个桌面版本中安装VBScript。
CScript.exe
是Windows Script Host的一部分。默认情况下,Windows Script Host已分发并安装在Windows 98和更高版本的Windows上。如果安装了Internet Explorer 5(或更高版本),则也将安装它。
如果您愿意使用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)}
您可以通过轮询压缩对话框窗口的存在来消除压缩期间超时的风险。此方法还可以处理用户取消压缩窗口的操作。
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
.Sleep(whatever)
使我恶心。
如果能够安装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.
'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
WScript.Sleep 200
Loop
objShell.NameSpace( ZipFile ).Items.Count
在循环中打印,即使创建了zip文件并且其中包含预期的内容,它也始终为0 ...
具有简化代码的多个文件/目录。
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
这是已接受答案的变异。我一次要对多达数千个文件执行大量自动化任务,因此我不能只睡2秒钟,也不在乎它。我在这里收集了解决方法,这也类似于JiříKočara 在这里的回答。
这将导致每200毫秒对目标文件夹执行一次ping操作,这大约与Microsoft检查FS更新的速度差不多。
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
Here'a我试图总结为压缩和解压缩内置功能窗口- https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders -与批处理-f
给出的解决方案几乎可以在所有Windows机器上使用。
至于shell.application和WSH,我更喜欢jscript, 因为它允许不需要临时文件的混合批处理/ jscript文件(扩展名为.bat)。我已经将unzip和zip功能放在一个文件中,并提供了更多功能。 。
如果在Windows 8或Windows Server 2012上,您将拥有PowerShell和.NET 4.5,则可以执行以下操作:
zip.ps1(用法:)-directory <directory to zip up> -name <zip name>
:
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,则目录为第一个参数,邮政编码为第二个):
@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"
现在,Windows命令行提供了紧凑命令,据我所知,该命令是Windows固有的。除非我没有错过任何东西,否则应该可以满足要求。
compact
XP以来一直存在,并且是管理NTFS压缩的工具