单独 Rar 子目录中的所有文件

Rar all files in subdirectories individually

我正在尝试使用批处理文件来压缩子目录中的所有文件。我在网上找到了以下脚本,它可以完成这项工作,但它会在 parent 目录中创建文件的 RAR 压缩版本。我希望它们保留在原来的目录中。

:sindiv
echo.
echo.
for /R %b IN (*.*) do (rar a "%~nb" "%b" )
)
goto eof

您的批处理代码只是在执行时产生一条语法错误消息,因为在循环变量引用中没有使用 %% 而不是 %。此外还有一个错误的右括号,并且有一个 goto 应该跳转到一个不存在的标签。

我建议使用下面的批处理代码:

@echo off
for /R %%I in (*.*) do (
    if /I not "%%~xI" == "rar" (
        if not exist "%%~dpnI.rar" (
            if not "%%~fI" == "%~f0" (
                "%ProgramFiles%\WinRAR\Rar.exe" a -cfg- -ep -idq -m5 -r- -tl -y -- "%%~dpnI" "%%I"
            )
        )
    )
)
goto :EOF

命令FOR 查找当前目录和所有子目录中所有未设置隐藏或系统文件属性的文件。

第一个不区分大小写的 IF 检查当前文件是否不是 *.rar 文件以避免重新压缩 *.rar 文件。

第二个 IF 检查当前文件在与该文件相同的目录中是否还没有 *.rar 文件以避免重新压缩之前可能已经压缩的文件之前执行过批处理文件。

如果批处理文件也存储在当前目录中,第三个 IF 将批处理文件从压缩中排除。

对于用于压缩文件的开关,请阅读 WinRAR 程序文件夹中的文本文件 Rar.txt,这是解释开关的控制台版本的手册。

goto eof 要求批处理文件中某处有标签eof。但是 goto :EOF 是命令 GOTO 的特殊命令扩展,用于退出不需要标签 EOF 的批处理文件或子程序的处理,并且在命令扩展是默认情况下启用。

上面的批处理文件可能适用于您的任务,但存在一个问题。假设一个目录包含文件 MyTestFile.csvMyTestFile.txt。上面的代码会将 MyTestFile.csv(在 NTFS 驱动器上,在 FAT32 驱动器上它也可以是 *.txt 文件而不是 *.csv 文件)压缩到 MyTestFile.rar 和另一个具有相同文件名的文件, 但完全忽略不同的文件扩展名,因为目录中已经存在 MyTestFile.rar

那么如何将两个文件放入同一个 RAR 文件?

方案一:

通过将 "%%I" 替换为 "%%~dpnI.*" 将所有文件名相同但文件扩展名不同的文件添加到 RAR 压缩文件中,并使用排除开关 -x 排除 *.rar文件也与此文件名模式匹配。

@echo off
for /R %%I in (*.*) do (
    if /I not "%%~xI" == "rar" (
        if not exist "%%~dpnI.rar" (
            if not "%%~fI" == "%~f0" (
                "%ProgramFiles%\WinRAR\Rar.exe" a -cfg- -ep -idq -m5 -r- -tl -x*.rar -y -- "%%~dpnI" "%%~dpnI.*"
            )
        )
    )
)

方案二:

仅将当前设置了存档属性的文件添加到 RAR 压缩包中,并在将文件添加到压缩包后清除压缩包属性。该解决方案还有一个优点,即根本不需要第二个 IF 条件,并且自上次压缩以来修改的文件再次在 运行 批处理文件的存档中更新。

@echo off
for /R %%I in (*.*) do (
    if /I not "%%~xI" == "rar" (
        if not "%%~fI" == "%~f0" (
            "%ProgramFiles%\WinRAR\Rar.exe" a -ac -ao -cfg- -ep -idq -m5 -r- -tl -y -- "%%~dpnI" "%%I"
        )
    )
)

第二个解决方案也可以在没有两个额外的 IF 条件的情况下使用排除开关 -x 两次来排除文件扩展名为 RAR 的所有文件以及批处理文件本身。

@echo off
for /R %%I in (*.*) do "%ProgramFiles%\WinRAR\Rar.exe" a -ac -ao -cfg- -ep -idq -m5 -r- -tl -x*.rar -x"%~f0" -y -- "%%~dpnI" "%%I"

但这会比以前的代码慢,因为有额外的 IF 条件,因为开始 Rar.exe 什么都不做比 [=103= 完成的两个字符串比较慢]命令处理器。

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

  • echo /?
  • for /?
  • goto /?
  • if /?

当然还有至少从上到下阅读文本文件 Rar.txt 一次。

您可以试试这个解决方案:

@echo off
Set "rar=%ProgramFiles%\WinRAR\Rar.exe"
for /R %%b IN (*.*) do ( 
    If /I not "%%~xb" == "rar" (
        If /I not "%%~nxb" == "%~nx0" (
            echo "%rar%" a "%%~dpnb.rar" "%%~dpnxb" 
            "%rar%" a "%%~dpnb.rar" "%%~dpnxb">nul 
        )   
    )   
)
pause