我想解压主文件夹中的一些子文件夹中的所有文件,解压后删除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
比大多数从未阅读过存储在WinRAR程序文件文件夹中的手册
Rar.txt
的用户所知道的更强大。
可以直接使用
Rar.exe
解压源文件夹的所有子文件夹中的所有 *.rar 文件,因为批处理代码中没有使用 for 循环。 Rar.exe
支持解压缩 RAR 存档文件时使用通配符,并且在命令 -r
上使用开关 x
会导致处理所有子文件夹中的所有 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" /?
PeaZip 可以在一次操作中提取和删除档案,就像 MacOS 上的 The Unarchiver 一样。