如何压缩包含N个文本文件的N个子文件夹的文本文件?

How to compress text files of N number sub folder which contains N number text files?

下面是一个目录结构,我必须将 app* 子目录中的所有 *.txt 文件压缩到名称为当前日期的 RAR 存档中,并删除存档文件和文件夹。

我对使用命令行和编写批处理脚本完全陌生,只知道一些基础知识。

对于如何使用 RarWinRAR 解决此任务有什么建议吗?

E: 
Data 
    Log
    makeRar.bat
        app1
            1.txt
            2.txt
            3.txt
            .
            .
            .
            n.txt
        app2
            1.txt
            2.txt
            3.txt
            .
            .
            .
            n.txt
        app3
            1.txt
            2.txt
            3.txt
            .
            .
            .
            n.txt
        .
        .
        .
        appn
            1.txt
            2.txt
            3.txt
            .
            .
            .
            n.txt

------------ makeRar.bat 文件执行后------------

E: 
Data 
    Log
    makeRar.bat
        app1
            4/1/2016_log.rar
        app2
            4/1/2016_log.rar
        app3
            4/1/2016_log.rar

根据您提供的信息,这应该可行。如果 RAR.exe 不在 PATH 变量的文件夹中,您需要将该路径添加到 PATH 变量或在批处理文件中提供可执行文件的完整路径。

@echo off

:: Get Date
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
SET "YYYY=%dt:~0,4%"
SET "MM=%dt:~4,2%"
SET "DD=%dt:~6,2%"


FOR /D %%G IN (app*) DO (
    PUSHD "%%~G"
    rar a %DD%%MM%%YYYY%_log.rar *.txt
    del *.txt
    POPD
)

WinRAR的program files文件夹中有文本文件Rar.txt,这是控制台版本Rar.exe的手册。通过查看此文件,首先 select 要使用的命令 - 这里是 a 用于 添加文件到存档 - 然后从上到下阅读有关开关的信息并在阅读时根据任务要求构建命令行,可以非常轻松地定义用于将文件压缩为 RAR 存档的命令行。

@echo off
for /D %%D in (app*) do (
    echo Creating archive for %%D ...
    "%ProgramFiles%\WinRAR\Rar.exe" a -agYYYY-MM-DD -cfg- -df -ep -idq -m5 -md4m -r- -s -y "%%D\log_.rar" "%%D\*.txt"
    if errorlevel 1 pause
)

您可以在文本文件 Rar.txt.

中阅读有关所有开关的信息

命令 PAUSE 仅在 Rar.exe 向控制台输出错误时执行,而所有其他消息由于开关 -idq.

RAR 压缩文件的文件名格式是 log_YYYY-MM-DD.rar,因为当目录中有多个这样的 RAR 压缩文件时,这比 DD-MM-YYYY_log.rar 要好得多,因为 log_YYYY-MM-DD.rar 显示是按字母顺序排列的默认情况下将文件名设为 Windows 会导致文件也自动按日期排序,最早的在最前面。

Rar 仅删除成功添加到存档中的文本文件。

当然也可以用WinRAR压缩:

@echo off
for /D %%D in (app*) do (
    echo Creating archive for %%D ...
    "%ProgramFiles%\WinRAR\WinRar.exe" a -agYYYY-MM-DD -cfg- -df -ep -ibck -m5 -md4m -r- -s -y "%%D\log_.rar" "%%D\*.txt"
)

WinRAR 也可以创建 ZIP 压缩文件而不是 RAR 压缩文件,控制台版本 Rar 不支持。

Rar switch -idq 替换为 WinRAR switch -ibck to 运行 WinRAR 最小化到系统托盘,即在后台。错误消息显示在 GUI window 中,如果发生错误,WinRAR 会自动显示。

有关 WinRAR 命令和开关的帮助,它们与 Rar 开关略有不同,请单击 WinRAR 在菜单 Help 中的 Help topics 并单击选项卡 Contents 上的项目 Command行模式并阅读链接页面。

要了解使用的 Windows 命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • for /?

看看使用 RarWinRAR 压缩文件是多么容易。真正需要的是分别查看手册帮助和关于在命令提示符 window.

中执行 help 时列出的 Windows 标准命令的一点知识

编辑:

以上两个批处理文件都要求批处理文件位于包含子目录app* 的目录中,并且此目录是当前目录。例如,要将此批处理文件作为当前目录为 %SystemRoot%\System32 的计划任务执行,下面的批处理代码会更好:

@echo off
for /D %%D in ("%~dp0app*) do (
    echo Creating archive for %%~fD ...
    "%ProgramFiles%\WinRAR\Rar.exe" a -agYYYY-MM-DD -cfg- -df -ep -idq -m5 -md4m -r- -s -y "%%~fD\log_.rar" "%%~fD\*.txt"
    if errorlevel 1 pause
)

命令FOR 搜索子目录app* 现在在批处理文件的目录中,与当前目录无关。并传递给 Rar 现在是具有完整路径的存档文件名称和文件名模式 *.txt 也具有完整路径而不是使用相对于当前目录的路径。

好吧,在将此批处理文件用作计划任务时应删除行 if errorlevel 1 pause

这个问题我有答案了。但是这个解决方案使用的是静态路径,而不是动态路径。因此,当执行此批处理文件时,它会完全按照需要生成输出,但根据下面的代码仅针对特定的 app 文件夹。

set loc="C:\Program Files\WinRAR"
cd /D %loc%
rar.exe a -r -agYYYY-MM-DD -df -ep %source%\app1\log_.rar %source%\app1\*.txt

source 必须用源目录路径定义。

编辑:

我通过迭代两个 FOR 循环为您的目录结构找到了更好的解决方案,其中第一个是获取当前目录和子目录,第二个是从子目录中获取文件。

set "source=C:\Program Files\WinRAR"

for /R /D %%s in (.\*) do (
    echo %%s
    for %%F in (%%s\*.txt*) do (
        "%source%\rar.exe" a -r -agYYYY-MM-DD -df -ep %%s\log_.rar %%F
    ) 
)
pause