如何使用WinRAR将文件夹中的每个子文件夹压缩为单独的RAR存档?

14

我对批处理文件编程非常陌生,需要你的帮助。

我有以下这些目录:

c:\rar\temp1\xy.jpg
c:\rar\temp1\sd.jpg
c:\rar\temp1\dd.jpg

c:\rar\temp2\ss.jpg
c:\rar\temp2\aa.jpg
c:\rar\temp2\sd.jpg

c:\rar\temp3\pp.jpg
c:\rar\temp3\ll.jpg
c:\rar\temp3\kk.jpg

我希望你能将它们压缩成这样

c:\rar\temp1\temp1.rar
c:\rar\temp2\temp2.rar
c:\rar\temp3\temp3.rar

如何使用WinRAR完成此操作?

5个回答

32
这也可以用WinRAR来完成,而不需要使用批处理文件,虽然不完全符合要求,但与所需的相似。
  1. 启动WinRAR并导航到文件夹c:\rar\
  2. 选择文件夹temp1temp2temp3,然后单击工具栏上的添加按钮。
  3. 现在将存档名称指定为RAR存档的文件夹,例如c:\rar\
  4. 切换到文件选项卡,在那里勾选选项将每个文件放入单独的存档中
  5. 单击确定按钮。
WinRAR现在在文件夹c:\rar\中创建了三个RAR存档,分别命名为temp1.rartemp2.rartemp3.rar,每个存档都包含相应的文件夹及其所有文件和子文件夹。
在“文件”选项卡上,您可以通过在“要排除的文件”中输入例如“*.txt”来更改要添加的文件列表,以便在创建存档时忽略这三个文件夹中的文本文件。
最后,在“文件”选项卡下方的编辑字段中输入“*.jpg”是有意义的,因为JPEG文件通常已经包含了压缩数据,所以“WinRAR”无法进一步压缩这些文件的数据。
这里还有一个批处理文件的解决方案,可以将目录下所有非隐藏子文件夹及其子文件夹中的文件移动到以每个子文件夹名称命名的存档文件中。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "RAREXE=Rar.exe"

if exist "%RAREXE%" goto CreateArchives
if exist "%ProgramFiles%\WinRAR\Rar.exe" set "RAREXE=%ProgramFiles%\WinRAR\Rar.exe" & goto CreateArchives
if exist "%ProgramFiles(x86)%\WinRAR\Rar.exe" set "RAREXE=%ProgramFiles(x86)%\WinRAR\Rar.exe" & goto CreateArchives
for /F "skip=2 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe query "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe" /v Path 2^>nul') do (
    if /I "%%I" == "Path" if exist "%%~K\Rar.exe" for %%L in ("%%~K\Rar.exe") do set "RAREXE=%%~fL" & goto CreateArchives
)
for /F "skip=2 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe query "HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe" /v Path 2^>nul') do (
    if /I "%%I" == "Path" if exist "%%~K\Rar.exe" for %%L in ("%%~K\Rar.exe") do set "RAREXE=%%~fL" & goto CreateArchives
)
for /F "delims=" %%I in ('%SystemRoot%\System32\where.exe Rar.exe 2^>nul') do set "RAREXE=%%I" & goto CreateArchives

echo ERROR: Could not find Rar.exe!
echo(
echo Please define the variable RAREXE at top of the batch file
echo "%~f0"
echo with the full qualified file name of the executable Rar.exe.
echo(
pause
exit /B

:CreateArchives
set "Error="
for /D %%I in ("c:\rar\*") do (
    echo Creating RAR archive for "%%I" ...
    "%RAREXE%" m -@ -cfg- -ep1 -idq -m3 -msgif;png;jpg;rar;zip -r -s- -tl -y -- "%%I\%%~nxI.rar" "%%I\"
    if errorlevel 1 set "Error=1"
)
if defined Error echo/& pause
endlocal

在定义环境变量RAREXE时,可以省略从"set "RAREXE=Rar.exe""到":CreateArchives"之间的行,只需正确设置完整的文件名。
请阅读位于WinRAR程序文件夹中的文本文件Rar.txt,了解RAR命令m和所使用的开关的说明。问题中没有提供任何有关如何创建RAR存档的选项信息。
为了理解所使用的命令及其工作原理,请打开一个命令提示符窗口,在其中执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
  • call /? ... 解释了 %~f0 ... 批处理文件的完整名称
  • echo /?
  • endlocal /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • reg /?
  • reg query /?
  • set /?
  • setlocal /?
  • where /?

另请参阅使用Windows批处理文件执行多个命令的单行,以了解运算符&的解释。

阅读Microsoft关于使用命令重定向运算符的文档,以了解2>nul的解释。在三个FOR命令行中,重定向运算符>必须用插入字符^进行转义,以便在Windows命令解释器处理此命令行之前将其解释为字面字符,然后执行嵌入的regwhere命令行,并使用单独启动的后台命令进程来执行。

在每个zip文件中,存在一个问题,即仍然有父文件夹。我只想要子文件,怎么办? - zhuhang.jasper
@zhuhang.jasper 发布的代码使用 WinRAR 创建了一个 RAR 压缩文件,而不是 ZIP 文件,因为控制台版本的 Rar.exe 无法创建 ZIP 压缩文件。只有使用 WinRAR.exe 才能完成这个任务,但需要对开关列表进行一些更改。使用 -ep1 时,Rar.exeWinRAR.exe 都不会将目录本身添加到压缩文件中,并且让目录路径以反斜杠结尾,而我的代码则是这样做的。参见:如何使用 WinRAR 命令行批处理压缩一个文件夹? - Mofi
1
但如果您使用WinRAR的GUI模式创建ZIP文件,则可以在选项卡“文件”上选择选项“不存储路径”,如果文件夹不包含子文件夹,只需将文件压缩到ZIP归档文件中。否则,在包含子文件夹的文件夹上添加到ZIP文件中时,需要从PowerShell控制台或Windows命令提示符窗口创建ZIP文件。 GUI不支持选择多个文件夹并将每个文件夹及其子文件夹和文件放入具有所选文件夹名称的ZIP归档中。 - Mofi

2
这个脚本同样可以工作:
@echo off
for %%a in ("C:\rar\temp1" "C:\rar\temp2" "C:\rar\temp3") do (
    pushd "%%~a"
    "C:\Program Files\WinRAR\rar.exe" a -r temp.rar *
    popd
)

2

在Python v3.x中:

  • 已测试通过Python v3.7
  • 已测试通过Windows 10 x64
import os

# NOTE: Script is disabled by default, uncomment final line to run for real.
base_dir = "E:\target_dir"
# base_dir = os.getcwd()  # Uncomment this to run on the directory the script is in.

# Stage 1: Get list of directories to compress. Top level only.
sub_dirs_raw = [os.path.join(base_dir, o) for o in os.listdir(base_dir) if os.path.isdir(os.path.join(base_dir, o))]

# Stage 2: Allow us exclude directories we do not want (can omit this entire section if we wish).
dirs = []
for d in sub_dirs_raw:
    if "legacy" in d or "legacy_old" in d:
        continue  # Skip unwanted directories
    print(d)
    dirs.append(d)

# Stage 3: Compress directories into .rar files.
for d in dirs:
    os.chdir(d)  # Change to target directory.
    # Also adds 3% recovery record using "-rr3" switch.
    cmd = f"\"C:\Program Files\\WinRAR\\rar.exe\" a -rr3 -r {d}.rar *"
    print(cmd)
    # Script is disabled by default, uncomment this next line to execute the command.
    # os.system(cmd)

注意:

  • 脚本仅会打印命令,除非最后一行os.system(cmd)被取消注释,即删除前面的#
  • 运行脚本,它将打印出它将执行的DOS命令。当您对结果满意时,请取消注释最后一行以真正运行它。
  • 例如:如果有一个包含三个文件夹mydir1mydir2mydir3的目录,它将创建三个.rar文件:mydir1.rarmydir2.rarmydir3.rar
  • 此演示代码将跳过名称中带有"legacy"和"legacy_old"的目录。您可以更新以添加要跳过的自己的目录。
  • 要执行脚本,请安装Python 3.x,将上面的行粘贴到script.py中,然后从任何目录运行DOS命令python script.py来设置目标目录。或者,使用PyCharm运行脚本。

1
不知道为什么这个没有得到赞同票。我总是更喜欢Python脚本而不是Windows批处理。Python更易读且功能更强大。我希望目标目录不是硬编码的,这样你可以将此脚本放在想要的目录中并运行它,并且它将假定目标目录与您放置脚本的目录相同。 - Curtwagner1984
1
@Curtwagner1984 确定,已更新脚本以匹配。如果要将脚本放在所需的目录中并运行它,假设目标目录与脚本所在的目录相同,请取消脚本中的第四行注释。 - Contango

1
以下脚本将在当前目录下将每个文件夹压缩为一个RAR文件,并在压缩大量数据时提供非常有用的信息。
@echo off
@for /D %%I in (".\*")  do echo started at %date% %time% compressing... "%%I" && @"%ProgramFiles%\WinRAR\Rar.exe" a -cfg- -ep1 -inul -m5 -r -- "%%I.rar" "%%I\" 
echo "Completed Successfully !!!"
pause 

enter image description here


0

这应该可以工作,它还会检查文件是否已经压缩好了。 根据WinRAR的安装位置,您可能需要更改此部分“cd Program Files\WinRAR”。

@echo Off
Cd\
cd Program Files\WinRAR
    rar a -r c:\rar\temp1\temp1.rar c:\rar\temp1\*.jpg c:\rar\temp1\
        if "%ERRORLEVEL%"=="0" ( Echo Files compressed
        ) Else Echo Failed
    rar a -r c:\rar\temp2\temp2.rar c:\rar\temp2\*.jpg c:\rar\temp2\
        if "%ERRORLEVEL%"=="0" ( Echo Files compressed
        ) Else Echo Failed
    rar a -r c:\rar\temp3\temp3.rar c:\rar\temp3\*.jpg c:\rar\temp3\
        if "%ERRORLEVEL%"=="0" ( Echo Files compressed
        ) Else Echo Failed
Pause

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接