这个小批处理代码有望满足您的需求。
@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" /?