【问题标题】:Rar all files in subdirectories individually单独解压子目录中的所有文件
【发布时间】:2017-01-06 08:14:07
【问题描述】:

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

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

【问题讨论】:

  • rar a "%~nb" "%b" 替换为rar a "%~dpnb" "%~b"... 在批处理文件中,您需要将b 周围的所有% 符号加倍...

标签: batch-file rar winrar


【解决方案1】:

由于在循环变量引用上没有使用%% 而不是%,因此您的批处理代码只会在执行时产生语法错误消息。此外,还有一个错误的右括号,并且有一个 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,并且在默认启用命令扩展时可用。 p>

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

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

解决方案 1:

通过将"%%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.*"
            )
        )
    )
)

解决方案 2:

仅将文件添加到当前设置了存档属性的 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"

但这会比以前的代码慢,因为启动 Rar.exe 什么都不做比 Windows 命令处理器完成的两个字符串比较慢。

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

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

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

【讨论】:

  • 嗨莫菲,谢谢!这很棒,完全符合需要(以及更多)
【解决方案2】:

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

@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

【讨论】:

  • 感谢 hackoo。这也完全符合我们的需要,干杯。
猜你喜欢
  • 2011-01-23
  • 2020-08-22
  • 1970-01-01
  • 2012-10-16
  • 2020-12-18
  • 2011-01-04
  • 2016-11-07
  • 1970-01-01
  • 2020-11-18
相关资源
最近更新 更多