Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理文件脚本到zip文件_Windows_Batch File - Fatal编程技术网

Windows 批处理文件脚本到zip文件

Windows 批处理文件脚本到zip文件,windows,batch-file,Windows,Batch File,我有一个这样的文件夹结构。我刚刚展示了两个子目录和每个目录中的2个文件,但通常我在单个级别上有n个子目录,在它们下面有单个级别的文件(但可以是n个文件) Directory master subDirectory x: file1 file2 Directory y: file 3 file 4 我需要创建一个windows脚本,一个从主目录运行的批处理文件,并给我两个包含各自文件的zip文件x.zip和y.zip 我知道我的脚本必须使用for和zip命令,但我正在疯狂地尝试让

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

Directory master
subDirectory x:
  file1
  file2
Directory y:
  file 3
  file 4
我需要创建一个windows脚本,一个从主目录运行的批处理文件,并给我两个包含各自文件的zip文件x.zip和y.zip

我知道我的脚本必须使用for和zip命令,但我正在疯狂地尝试让它工作,因为我无法理解这些命令的语法,谷歌搜索似乎也帮不上忙

我在(“**”)do zip“%~nf.zip”“%f”中为%f找到了这样的
命令,但它似乎只有在文件直接存在且没有子文件夹时才起作用。

您就在附近:)

首先,批处理(%%变量)和Windows CMD(%variable)使用不同的变量命名。 其次,我不知道如何使用CMD中的zip。我想这是来自Linux用户。使用内置的zip操作不像轻松的Win,使用批处理脚本更难

但你还是很幸运的。我从cygwin包中获得了(解压缩到目标文件夹)zip.exe和cygwin1.dll(两个文件大小都为3mb),并立即开始使用它

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

对于(*)中的/d%d进行压缩-r%d%d

说明:
for/d…
匹配其中任何文件夹。仅文件夹忽略文件。(用于/f以匹配文件)
for/d%d in…
d%d告诉cmd您要为变量指定哪个名称。我将d与widh d(目录含义)匹配。
对于(*)中的/d%d…
非常重要。这会将我的
CD
备份到所需的文件夹,或从中运行
(*)
这意味着所有文件都在这个目录中,因为我们使用
/d
文件不会被处理,所以不需要设置模式,即使您需要时只能获得一些文件夹。您可以使用绝对路径。不确定批次中亲戚的问题。
对于(*)do-zip-r中的/d%d…
do-zip是显而易见的。(exec zip本身并查看帮助显示以使用自定义规则)。r-表示递归,因此将添加任意项。
for/d%d in(*)do zip-r%d%d
第一个%d是邮政编码名称。您可以尝试使用myzip.zip,但是if将失败,因为如果您有两个或更多文件夹,则第二个文件夹无法给出第一个文件夹的名称,并且在没有更多参数的情况下不会尝试覆盖。因此,我们将%d传递给这两个文件夹,它是压缩到具有文件夹名称的文件中的当前for iteration文件夹名称。不需要在名称后面附加“.zip”

比我开始玩的时候想象的要短

for /d %%a in (*) do (ECHO zip -r -p "%%~na.zip" ".\%%a\*")
应在批内工作


注意,我已经包含了一个
ECHO
,以简单地显示建议的命令。您需要删除ECHO来执行命令。

我知道已经太晚了,但是如果您还想尝试的话

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

这里*是当前文件夹。有关更多选项,请尝试在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
这是由一个编写良好的脚本来压缩文件夹的内容

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

无需提及目标目录,因为它是桌面脚本(“%USERPROFILE%\Desktop”)中的默认目录

在此处复制脚本,以防web链接关闭:

@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

这是存档单个文件的正确语法;批处理中的文件夹作为单个压缩文件

for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a -mx "%%X.zip" "%%X\*"
我喜欢的答案是在没有额外工具的情况下实现这一点。对我来说,它没有用完的盒子,所以我不得不稍微改变它。我不确定原始脚本中的命令
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文件tozip.txt

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


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

    Zip*.cmd脚本

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


注意:如果要调试VBS脚本, ,它描述了如何激活调试器以逐步执行调试器。

简单脚本 将桌面中的所有转储文件夹和子文件夹文件转换为备份.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

目录y
在主目录中吗?它可以在没有外部工具的情况下完成-您不应该使用
-rp
?否则,重复的文件名会发生冲突,不是吗?正如您所说,当尝试添加相同的文件名时,会发生冲突,但是。。。我们从真实文件夹中获取真实文件。没有任何重复的文件名。我们将每个子文件夹的内容放入一个类似文件夹的zip文件中。没有碰撞。当我开始发帖时,我试着把真实的文件夹放到我的系统中:)谢谢大家的回复,谢谢erm3nda的详细解释。这一切都帮了我的忙。再次感谢。你是在加入回音线之前还是之后尝试的?两种方式。你看到问题了吗?是的,但可能是因为我使用了cygwin的zip.exe。我第一次在我的live上键入mi Win7 cmd上的zip。。。什么也没做。。。所以我买了一个cygwin。使用@monacraft,我发现a.zip不能与$a等进行比较。我不知道~n。。。我不需要它来做同样的事情。使用您的脚本,我得到了*\是dos风格,建议使用posix/*/以及关于比较