批处理文件脚本到zip文件

时间:2013-12-10 03:21:57

标签: windows batch-file

我有这种模式的文件夹结构。我刚刚显示了两个子目录和每个文件中的两个文件,但通常我在单个级别上有n个子目录,在它们下面有单个级别的文件(但可以是n个文件)。

Directory master
subDirectory x:
  file1
  file2
Directory y:
  file 3
  file 4

我需要创建一个Windows脚本,一个从主目录运行的批处理文件,并给我两个包含各自文件的zip文件x.zip和y.zip。

我知道我的脚本必须使用for和zip命令,但我正试图让它工作,因为我无法理解这些命令的语法和谷歌搜索似乎没有帮助。

我发现了一个像for %f in ("*.*") do zip "%~nf.zip" "%f"这样的命令,但它似乎只在没有子文件夹的情况下直接存在。

8 个答案:

答案 0 :(得分:18)

for /d %%a in (*) do (ECHO zip -r -p "%%~na.zip" ".\%%a\*")

应该在批次内工作。

请注意,我已经包含ECHO来简单地显示建议的命令。您需要删除ECHO密钥才能执行命令。

答案 1 :(得分:10)

我知道为时已晚,但如果你还想尝试

for /d %%X in (*) do (for /d %%a in (%%X) do ( "C:\Program Files\7-Zip\7z.exe" a -tzip "%%X.zip" ".\%%a\" ))

这里*是当前文件夹。如需更多选项,请尝试this link

答案 2 :(得分:5)

你就在附近:)

首先,批处理(%%变量)和Windows CMD(%变量)使用不同的变量命名。 其次,我不知道你如何使用CMD的zip。这是来自我认为的Linux用户。在Win上使用内置的zip操作并不简单,使用批处理脚本更难。

但无论如何你很幸运。我从cygwin包中获取(提取到目标文件夹)zip.exe和cygwin1.dll(3mb文件大小),并立即开始播放。

当然,我使用CMD进行更好/更快的测试而不是批处理。只记得在责备我之前将%varname修改为%% varname:P

<强> for /d %d in (*) do zip -r %d %d

说明: for /d ...匹配里面的任何文件夹。只有忽略文件的文件夹。 (用于/ f到文件匹配) for /d %d in ...%d告诉cmd你想给你的变量分配名称吗?我把d匹配widh d(目录含义)。 for /d %d in (*) ...非常重要。这使我CD到所需的文件夹,或从中运行。 (*)这意味着所有这一点,因为我们使用/d文件未处理,所以不需要设置模式,即使你只需要一些文件夹。您可以使用绝对路径。不确定批次亲戚的问题。 for /d %d in (*) do zip -r ... ZIP是显而易见的。 (exec zip本身并查看帮助显示以使用您的自定义规则)。 r-用于递归,因此将添加任何内容。 for /d %d in (*) do zip -r %d %d 第一个%d是zip名称。您可以尝试使用myzip.zip,但如果失败,因为如果您有2个或更多文件夹,则第二个不能给出第一个文件夹的名称,并且不会在没有更多参数的情况下覆盖。因此,我们将%d传递给两者,这是当前迭代文件夹名称压缩到具有文件夹名称的文件中。不必附加“.zip”来命名。

开始玩时,比我预期的要短。

答案 3 :(得分:5)

没有外部依赖7zip或ZIP - 创建一个vbs脚本并执行:

    @ECHO Zipping
    mkdir %TEMPDIR%
    xcopy /y /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 *******************************************
    @ECHO Zipping, please wait..
    echo wScript.Sleep 12000 >> _zipIt.vbs
    CScript  _zipIt.vbs  %TEMPDIR%  %OUTPUTZIP%
    del _zipIt.vbs
    rmdir /s /q  %TEMPDIR%

    @ECHO *******************************************
    @ECHO      ZIP Completed

答案 4 :(得分:1)

这是归档个人的正确语法;批量文件夹作为单独的压缩文件......

for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a -mx "%%X.zip" "%%X\*"

答案 5 :(得分:1)

我喜欢PodTech.io的答案,无需其他工具即可实现这一目标。对我来说,它并没有用完,所以我不得不稍作更改。我不确定是否需要原始脚本中的命令wScript.Sleep 12000(延迟12秒),所以我保留了它。

这是根据他的回答修改的脚本Zip.cmd,对我来说效果很好:

@echo off   
if "%1"=="" goto end

setlocal
set TEMPDIR=%TEMP%\ZIP
set FILETOZIP=%1
set OUTPUTZIP=%2.zip
if "%2"=="" set OUTPUTZIP=%1.zip

:: preparing VBS script
echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo Set fso = WScript.CreateObject("Scripting.FileSystemObject") >> _zipIt.vbs
echo Set objZipFile = fso.CreateTextFile(ZipFile, True) >> _zipIt.vbs
echo objZipFile.Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo objZipFile.Close >> _zipIt.vbs
echo Set objShell = WScript.CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo Set objZip = objShell.NameSpace(fso.GetAbsolutePathName(ZipFile)) >> _zipIt.vbs
echo if not (objZip is nothing) then  >> _zipIt.vbs
echo    objZip.CopyHere(source) >> _zipIt.vbs
echo    wScript.Sleep 12000 >> _zipIt.vbs
echo end if >> _zipIt.vbs

@ECHO Zipping, please wait...
mkdir %TEMPDIR%
xcopy /y /s %FILETOZIP% %TEMPDIR%
WScript _zipIt.vbs  %TEMPDIR%  %OUTPUTZIP%
del _zipIt.vbs
rmdir /s /q  %TEMPDIR%

@ECHO ZIP Completed.
:end

用法:

  • 一个参数(此处不允许使用通配符):

    Zip FileToZip.txt

    将在包含压缩文件FileToZip.txt.zip的同一文件夹中创建FileToZip.txt

  • 两个参数(可选地,第一个参数带有通配符),例如

    *。cmd压缩脚本

    在包含所有匹配的Scripts.zip文件的同一文件夹中创建*.cmd


注意:如果要调试VBS脚本, check out this hint,介绍如何激活调试器以逐步进行调试。

答案 6 :(得分:0)

简单的脚本 它将桌面中的所有转储文件夹和子文件夹文件转换为 backup.zip

在backup.bat中写下这一行并执行

"C:\Program Files\7-Zip\7z.exe" a -tzip "C:\Users\shris\Desktop\backup.zip" -r "C:\Users\shris\Desktop\dump\*" -mx5

答案 7 :(得分:-1)

这是link Tomas有一个写得很好的脚本来压缩文件夹的内容。

要使其正常工作,只需将脚本复制到批处理文件中,然后通过指定要压缩的文件夹(源)来执行它。

无需提及目标目录,因为它在脚本中默认为桌面(&#34;%USERPROFILE%\ Desktop&#34;)

在此处复制脚本,只是因为网络链接已关闭:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

SET sourceDirPath=%1
IF [%2] EQU [] (
  SET destinationDirPath="%USERPROFILE%\Desktop"
) ELSE (
  SET destinationDirPath="%2"
)
IF [%3] EQU [] (
  SET destinationFileName="%~n1%.zip"
) ELSE (
  SET destinationFileName="%3"
)
SET tempFilePath=%TEMP%\FilesToZip.txt
TYPE NUL > %tempFilePath%

FOR /F "DELIMS=*" %%i IN ('DIR /B /S /A-D "%sourceDirPath%"') DO (
  SET filePath=%%i
  SET dirPath=%%~dpi
  SET dirPath=!dirPath:~0,-1!
  SET dirPath=!dirPath:%sourceDirPath%=!
  SET dirPath=!dirPath:%sourceDirPath%=!
  ECHO .SET DestinationDir=!dirPath! >> %tempFilePath%
  ECHO "!filePath!" >> %tempFilePath%
)

MAKECAB /D MaxDiskSize=0 /D CompressionType=MSZIP /D Cabinet=ON /D Compress=ON /D UniqueFiles=OFF /D DiskDirectoryTemplate=%destinationDirPath% /D CabinetNameTemplate=%destinationFileName%  /F %tempFilePath% > NUL 2>&1

DEL setup.inf > NUL 2>&1
DEL setup.rpt > NUL 2>&1
DEL %tempFilePath% > NUL 2>&1