如何解压文件夹所有子文件夹中的所有 rar 档案,然后删除档案?

How to unpack all rar archives in all subfolders of a folder and then delete the archives?

我想解压主文件夹中某些子文件夹中的所有文件,解压后删除 xxx.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" 文件夹,而不是在主文件夹中解压所有内容后才移动。

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

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

@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 比大多数从未阅读 Rar.txt 存储在 WinRAR 程序文件夹中的手册的用户所知道的更强大。

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

选项 -ad 意思是 append archive name to destination path 如果所有压缩文件都包含唯一的文件夹名称,或者所有档案都应该解压到同一个目录中,并覆盖之前解压的先前档案中的现有文件。 -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 上任何 运行ning 进程的当前工作目录时,才能通过 rd 删除文件夹。

可以通过打开命令提示符 window 和 运行 来阅读批处理文件中使用的每个命令的帮助:

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