【问题标题】:How to unpack all rar archives in all subfolders of a folder and then delete the archives?如何解压文件夹所有子文件夹中的所有 rar 压缩包然后删除压缩包?
【发布时间】:2015-10-03 20:15:02
【问题描述】:

我想解压主文件夹中的一些子文件夹中的所有文件,解压后删除xxx.rar文件并将包含文件的文件夹移动到另一个位置。

  • 主文件夹
    • 子文件夹1 (带有.rar文件)
    • 子文件夹2 (带有.rar文件)
    • 子文件夹 3 (带有 .rar 文件)

这是我的批处理脚本,到目前为止有效。

SET "sourcefolder=C:\Users\Unpack"
FOR /R %sourcefolder% %%X in (*.rar) do (
    pushd "%%~dpX"
    "C:\Program Files\WinRAR\Rar.exe" x -y "%%X" "*.*" && del "*.rar"
    popd
)
for /d /r %sourcefolder% %%x in (*) do move "%%x" "C:\Users\New-Location")

但我希望每个解压文件的子文件夹立即移动到“New-Location”文件夹,而不仅仅是在主文件夹中解压所有内容之后。

一些想法我必须在代码中更改什么?

【问题讨论】:

    标签: batch-file unpack rar winrar


    【解决方案1】:

    这个小批处理代码有望满足您的需求。

    @echo off
    set "SourceFolder=C:\Users\Unpack"
    set "TargetFolder=C:\Users\New-Location"
    if not exist "%TargetFolder%" md "%TargetFolder%"
    "%ProgramFiles%\WinRAR\Rar.exe" x -ad -cfg- -idq -r -y "%SourceFolder%\*.rar" "%TargetFolder%"
    del /F /Q /S "%SourceFolder%\*.rar">nul
    for /D %%D in ("%SourceFolder%\*") do rd "%%D" 2>nul
    

    控制台版本Rar.exe 比大多数从未阅读WinRAR 程序文件夹中存储的手册Rar.txt 的用户都知道的更强大。

    可以直接使用Rar.exe解压源文件夹所有子文件夹中的所有*.rar文件,可以看出因为批处理代码中没有使用for循环。 Rar.exe 支持在解压缩 RAR 存档文件时使用通配符,并在命令 x 上使用开关 -r 会导致处理所有子文件夹中的所有 RAR 存档文件,如手册所述。

    选项-ad 意思是将存档名称附加到目标路径 如果所有存档都包含唯一的文件夹名称,则可以从RAR 命令行中删除,或者所有存档都应该被解压缩进入同一目录,并覆盖之前解压缩的先前存档中的现有文件。 -ad 的使用取决于存档文件的内容。

    选项-idq表示安静模式,即只输出错误信息,不输出进度信息,速度更快。

    解压后删除所有 *.rar 文件也无需 for 循环,因为命令 del 还支持删除所有子文件夹中的所有 *.rar 文件一个文件夹。

    编辑:

    为了在删除所有RAR文件后删除源文件夹中的所有子文件夹为空,但保留源文件夹,最后需要一个for循环,如上面的代码中添加的那样。

    命令rd忽略不为空的子文件夹,因为不使用参数/S /Q,即使子文件夹尚未完全为空也会删除。

    如果要删除的子文件夹不为空,rd 输出到 stderr 的错误消息被重定向到设备 nul 以抑制它。

    要在解压所有 RAR 压缩包后删除源文件夹的所有子文件夹,独立于这些子文件夹包含的内容,但保留源文件夹,上面的最后两行批处理代码需要替换为以下行:

    for /D %%D in ("%SourceFolder%\*") do rd /S /Q "%%D" 2>nul
    

    并且为了删除源文件夹及其所有子文件夹,上面的最后两行批处理代码需要替换为以下行:

    rd /S /Q "%SourceFolder%" 2>nul
    

    注意:只有当文件夹不是 Windows 上任何正在运行的进程的当前工作目录时,才能被 rd 删除。

    可以通过打开命令提示符窗口并在那里运行来读取批处理文件中使用的每个命令的帮助:

    • del /?
    • for /?
    • if /?
    • md /?
    • rd /?
    • set /?
    • "%ProgramFiles%\WinRAR\Rar.exe" /?

    【讨论】:

    • 我已阅读 Rar.exe 控制台帮助,但不了解所有开关 :) thx 解释 -ad-idq。我发现您的脚本在解压缩后将文件复制到md "%TargetFolder%" 位置,但只有在主文件夹中的子文件夹中的所有文件都解压缩并将 emty 文件夹留在“SourceFolder”中之后才删除 .rar 文件。为了删除 emty 文件夹,我现在使用了这一行。 for /f "usebackq delims=" %%d in ("dir "C:\Users\Unpack\" /ad/b/s | sort /R") do rd "%%d")移动到“新位置”后如何直接删除包含他的文件的子文件夹?
    • Rar.exe 将文件和文件夹直接提取到指定的目标文件夹(或使用 -ad 开关时的存档文件名称的子文件夹)。 RAR 完成后删除源文件夹中的文件夹,请参阅上面的编辑答案。
    • 再次感谢解释。事情我不够清楚。我通过 FTP 监控程序下载了包含 .r 文件的文件夹,并希望 winrar 进入主文件夹的第一个子文件夹并在 .r00 开始解压缩,删除存档并将包含解压缩文件的文件夹移动到新位置。然后脚本应该使用下一个子文件夹再次启动此过程。
    • 我也这么认为。我将创建一个新问题。
    • 使用不同算法提取多卷档案的新问题是here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2019-02-09
    • 2013-03-09
    • 2012-05-25
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多