Batch file 分别对子目录中的所有文件进行Rar

Batch file 分别对子目录中的所有文件进行Rar,batch-file,rar,winrar,Batch File,Rar,Winrar,我正在尝试使用批处理文件来rar子目录中的所有文件。我在网上找到了以下脚本,它完成了这项工作,但它在父目录中创建了文件的RAR压缩版本。我希望它们保留在原来的目录中 :sindiv echo. echo. for /R %b IN (*.*) do (rar a "%~nb" "%b" ) ) goto eof 批处理代码只是在执行时生成语法错误消息,因为没有在循环变量引用上使用%%而不是%%。此外,还有一个错误的右括号,还有一个goto,它应该跳转到一个不存在的标签 我建议使用以下批次代码:

我正在尝试使用批处理文件来rar子目录中的所有文件。我在网上找到了以下脚本,它完成了这项工作,但它在父目录中创建了文件的RAR压缩版本。我希望它们保留在原来的目录中

:sindiv
echo.
echo.
for /R %b IN (*.*) do (rar a "%~nb" "%b" )
)
goto eof

批处理代码只是在执行时生成语法错误消息,因为没有在循环变量引用上使用
%%
而不是
%%
。此外,还有一个错误的右括号,还有一个
goto
,它应该跳转到一个不存在的标签

我建议使用以下批次代码:

@echo off
for /R %%I in (*.*) do (
    if /I not "%%~xI" == "rar" (
        if not exist "%%~dpnI.rar" (
            if not "%%~fI" == "%~f0" (
                "%ProgramFiles%\WinRAR\Rar.exe" a -cfg- -ep -idq -m5 -r- -tl -y -- "%%~dpnI" "%%I"
            )
        )
    )
)
goto :EOF
命令FOR查找当前目录和所有子目录中未设置隐藏或系统文件属性的所有文件

第一个不区分大小写的IF检查当前文件是否为*.rar文件,以避免重新压缩*.rar文件

第二个IF检查当前文件在与该文件相同的目录中是否还没有*.rar文件,以避免重新压缩先前执行批处理文件时已压缩的文件

如果批处理文件也存储在当前目录中,则第三个IF将批处理文件从压缩中排除

:sindiv
echo.
echo.
for /R %b IN (*.*) do (rar a "%~nb" "%b" )
)
goto eof
对于用于压缩文件的开关,请阅读WinRAR程序文件文件夹中的文本文件
Rar.txt
,该文件是控制台版本的手册,用于解释开关

转到eof
要求批处理文件中的某个位置有标签
eof
。但是
goto:EOF
是commandgoto的特殊命令扩展,用于退出批处理文件或不需要标签
EOF
的子例程的处理,并且在默认情况下启用命令扩展时可用

上面的批处理文件可能适用于您的任务,但有一个问题。假设一个目录包含文件
MyTestFile.csv
MyTestFile.txt
。上面的代码将
MyTestFile.csv
(在NTFS驱动器上,在FAT32驱动器上,它也可以是*.txt文件而不是*.csv文件)压缩为
MyTestFile.rar
,另一个文件具有相同的文件名,但是完全忽略了不同的文件扩展名,因为目录中已经存在一个
MyTestFile.rar

:sindiv
echo.
echo.
for /R %b IN (*.*) do (rar a "%~nb" "%b" )
)
goto eof
那么,如何将这两个文件放在同一个RAR文件中呢

解决方案1:

将具有相同文件名但不同文件扩展名的所有文件添加到RAR存档文件中,方法是将
“%%I”
替换为
“%%dpnI.*”
,并使用排除开关
-x
排除也与此文件名模式匹配的*.RAR文件

@echo off
for /R %%I in (*.*) do (
    if /I not "%%~xI" == "rar" (
        if not exist "%%~dpnI.rar" (
            if not "%%~fI" == "%~f0" (
                "%ProgramFiles%\WinRAR\Rar.exe" a -cfg- -ep -idq -m5 -r- -tl -x*.rar -y -- "%%~dpnI" "%%~dpnI.*"
            )
        )
    )
)
解决方案2:

仅将当前已设置存档属性的文件添加到RAR存档,并在将文件添加到存档后清除存档属性。此解决方案还有一个优点,即根本不需要第二个IF条件,并且在再次运行批处理文件时,在存档中更新自上次压缩以来修改的文件

@echo off
for /R %%I in (*.*) do (
    if /I not "%%~xI" == "rar" (
        if not "%%~fI" == "%~f0" (
            "%ProgramFiles%\WinRAR\Rar.exe" a -ac -ao -cfg- -ep -idq -m5 -r- -tl -y -- "%%~dpnI" "%%I"
        )
    )
)
通过使用exclude开关
-x
两次排除文件扩展名为RAR的所有文件以及批处理文件本身,第二种解决方案也可以不使用两个附加的IF条件

@echo off
for /R %%I in (*.*) do "%ProgramFiles%\WinRAR\Rar.exe" a -ac -ao -cfg- -ep -idq -m5 -r- -tl -x*.rar -x"%~f0" -y -- "%%~dpnI" "%%I"
但这将比以前的代码慢,如果启动
Rar.exe
的条件比Windows命令处理器进行的两个字符串比较慢,则使用附加的

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • echo/?
  • 获取/?
  • goto/?
  • 如果/?

当然,从上到下至少阅读一次文本文件
Rar.txt

您可以尝试以下解决方案:

@echo off
Set "rar=%ProgramFiles%\WinRAR\Rar.exe"
for /R %%b IN (*.*) do ( 
    If /I not "%%~xb" == "rar" (
        If /I not "%%~nxb" == "%~nx0" (
            echo "%rar%" a "%%~dpnb.rar" "%%~dpnxb" 
            "%rar%" a "%%~dpnb.rar" "%%~dpnxb">nul 
        )   
    )   
)
pause

rar a“%~nb”“%b”
替换为
rar a“%~dpnb”“%~b”
。。。在批处理文件中,您需要将
%
b周围的所有
%
符号加倍……嗨,Mofi,谢谢!这是伟大的,做的正是需要的(和更多的)感谢hackoo。这也正是我们需要的,干杯。