我尝试使用批处理文件来填充子目录中的所有文件。我在网上找到了以下脚本,它完成了这项工作,但它在 parent 目录中创建了RAR压缩版本的文件。我希望他们留在原来的目录中。
:sindiv
echo.
echo.
for /R %b IN (*.*) do (rar a "%~nb" "%b" )
)
goto eof
答案 0 :(得分:2)
您的批处理代码只会在执行时产生语法错误消息,因为在循环变量引用上没有使用%%
而不是%
。还有一个错误的右括号,并且有一个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 会从压缩中排除批处理文件。
对于压缩文件时使用的开关,请阅读WinRAR的程序文件文件夹中的文本文件Rar.txt
,该文件夹是解释开关的控制台版本的手册。
goto eof
要求批处理文件中的某处有一个标签eof
。但goto :EOF
是命令 GOTO 的特殊命令扩展,用于退出批处理文件或不需要标签EOF
的子例程的处理,并且在启用命令扩展时可用默认值。
上面的批处理文件可能适合您的任务,但有一个问题。我们假设一个目录包含文件MyTestFile.csv
和MyTestFile.txt
。上面的代码会压缩MyTestFile.csv
(在NTFS驱动器上,在FAT32驱动器上它也可能是* .txt文件而不是* .csv文件)到MyTestFile.rar
而另一个文件具有相同的文件名,但完全忽略了不同的文件扩展名,因为目录中已存在MyTestFile.rar
。
那么如何将两个文件放到同一个RAR文件中呢?
解决方案1:
将"%%I"
替换为"%%~dpnI.*"
,将具有相同文件名但文件扩展名不同的所有文件添加到RAR存档文件中,并使用排除开关-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"
)
)
)
第二个解决方案也可能没有两个额外的 IF 条件,使用排除开关-x
两次排除所有文件扩展名为RAR的文件以及批处理文件本身。
@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"
但是这会比之前的代码慢一些 IF 条件,因为无效的起始Rar.exe
比Windows命令处理器完成的两次字符串比较慢。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
echo /?
for /?
goto /?
if /?
当然,从上到下至少阅读一次文本文件Rar.txt
。
答案 1 :(得分:1)
您可以试用这个解决方案:
@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