2016-01-13 121 views
1

我试图与结构压缩我的子目录这样压缩子目录

Files1\files11\...(files) 
Files1\files12\...(files) 
Files2\files21\...(files) 
Files2\files22\...(files) 

我想压缩它像

Files1\files11.rar 
Files1\files12.rar 
Files2\files21.rar 
Files2\files22.rar 

,而不删除原始文件夹。

我试过这个脚本

for /d %%d in (*\*) do ("C:\Program Files\WinRAR\Rar.exe" a -m5 -s "%%d.rar" "%%d") 

,但它仅适用于一个级别。 我也试过Batch file to compress subdirectories但由于某种原因,它不起作用。它抛出文件未找到错误。

感谢

回答

0

Windows命令行不支持通配符在文件/文件夹路径的文件夹。 *\*因此无效。

两个嵌套的FOR环需要具有外环在当前目录中运行的处理的目录Files1Files2并与内环处理的目录files11files12files21files22以及这些子目录运行的RAR

首批代码创建归档文件

Files1\files11.rar 
Files1\files12.rar 
Files2\files21.rar 
Files2\files22.rar 

与每个存档中包含归档目录files11files12files21files22

@echo off 
set "CompressionError=0" 

rem Set directory of batch file as working directory. 
pushd "%~dp0" 

rem For each directory in working directory run a second loop which 
rem compresses each subdirectory of current directory to a RAR archive 
rem with deleting all files and subdirectories as well as the archived 
rem directory itself and name the archive file like the archived directory. 

for /D %%D in (*) do (
    for /D %%F in ("%%D\*") do (
     "%ProgramFiles%\WinRAR\Rar.exe" a -cfg- -df -ep1 -idq -m5 -md4m -r -s -y "%%F.rar" "%%F" 
     if errorlevel 1 set "CompressionError=1" 
    ) 
) 

rem Restore the previous working directory. 
popd 

rem Halt batch processing if any error occurred on any compression. 
if "%CompressionError%" == "1" pause 
set "CompressionError=" 

第二批代码还创建了4个存档文件,但是归档目录files11files12files21files22没有被添加到存档。

@echo off 
set "CompressionError=0" 

rem Set directory of batch file as working directory. 
pushd "%~dp0" 

rem For each directory in working directory run a second loop which 
rem compresses each subdirectory of current directory to a RAR archive 
rem with deleting all files and subdirectories as well as the archived 
rem directory itself and name the archive file like the archived directory. 

for /D %%D in (*) do (
    for /D %%F in ("%%D\*") do (
     "%ProgramFiles%\WinRAR\Rar.exe" a -cfg- -df -ep1 -idq -m5 -md4m -r -s -y "%%F.rar" "%%F\" 
     if errorlevel 1 (
      set "CompressionError=1" 
     ) else (
      rd "%%F" 
     ) 
    ) 
) 

rem Restore the previous working directory. 
popd 

rem Halt batch processing if any error occurred on any compression. 
if "%CompressionError%" == "1" pause 
set "CompressionError=" 

看在程序文本文件Rar.txt文件的WinRAR的文件夹上使用的的RAR开关细节是为了控制台版本的WinRAR手册。

这两个批处理文件都不会在执行过程中显示任何内容,如果没有错误发生,它们将自动退出。但是,如果发生任何压缩错误,批处理将暂停,以便批处理用户可以查看Rar输出的错误消息到控制台窗口。

为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /?解释%~dp0(驱动器和参数0的路径 - 批处理文件)
  • echo /?
  • for /?
  • if /?
  • pause /?
  • popd /?
  • pushd /?
  • rd /?
  • rem /?
  • set /?
+0

感谢。虽然有些东西我仍然不明白。 1.为什么在批处理文件的最后一步将CompressionError设置为空? – christantoan

+0

2. %% D和%% F代表目录和文件吗? – christantoan

+0

'set“CompressionError = 0”'也可以是'set'CompressionError =“'保证没有环境变量'CompressionError'值为'1',在此批处理脚本之外偶然定义,导致停止批处理此批处理脚本的结尾。 '%% D'和'%% F'是目录的循环变量。目录'Files1'和'Files2'以及'%% F'的'%% D'作为相对于当前目录的子目录,如'Files1 \ files11'。添加到外部循环'echo %% D'和内部循环'echo %% F'使得您可以查看循环变量值。 – Mofi