假设这个目录结构:
\
└─SomeRootFolder
├─SuperfolderA
│ ├─filenames.txt
│ ├─passwords.txt
│ ├─A1
│ │ └─...
│ ├─A2
│ │ └─...
│ └─...
├─SuperfolderB
│ ├─filenames.txt
│ ├─passwords.txt
│ ├─B1
│ │ └─...
│ ├─B2
│ │ └─...
│ └─...
└─...
(子文件夹A1
, A2
, ... B1
, B2
,...需要放入自己的档案中),以下内容对我有用:
@ECHO OFF
SET arch="C:\Program Files (x86)\WinRAR\WinRAR.exe"
SET "rootdir=D:\path\to\folders"
SET "namestxt=filenames.txt"
SET "passtxt=passwords.txt"
FOR /D %%D IN ("%rootdir%\*") DO (
<"%%D\%passtxt%" (
FOR /F "usebackq delims=" %%N IN ("%%D\%namestxt%") DO (
SET /P "pass="
SETLOCAL EnableDelayedExpansion
%arch% a -r -ep1 -hp!pass! "%%D\%%N.rar" "%%D\%%N"
ENDLOCAL
)
)
)
第一部分仅设置一些变量,稍后在脚本中使用。 (事实上,它们中的每一个都只在脚本中使用一次,因此您可以轻松地替换相应变量扩展的值。我只是习惯性地声明这些变量,我经常在批处理脚本中使用这样的变量。)
外循环,FOR /D
一,迭代“超级文件夹”,其中包含要存档的子文件夹和文本文件。
循环体以这种方式读取两个文件:
So, the %%D
循环变量(外部循环的变量)包含“超级文件夹”的完整路径,%%N
被分配了一个子文件夹的名称并且pass=
被设置为相应的密码。此时只需调用归档器即可。
这些是归档器命令行中使用的参数:
a
– 正确的 Add 命令(与 Extract 命令相反,Extract 命令是x
,或更新,即u
);
-r
– 递归处理指定的文件夹(如果不需要,请删除此选项);
-ep
– 从名称中排除基本文件夹;
-hp…
– 使用指定的密码加密存档(与-p…
,这仅仅保护了萃取; -hp
不会让您在没有密码的情况下看到存档的内容,就像您似乎想要的那样)。
可以看到,在调用归档器之前,延迟扩展是启用的。如果您不知道括号中的命令块(包括循环体)中“立即”扩展的效果,我只想说,如果变量同时被分配和扩展,它就不会像您想要的那样工作相同的括号块。因此延迟了扩张。它用!
s 而不是%
s,你可以看到pass
变量就这样扩展了。
还有一件事需要提及。如果您生成的密码少于其他文件中的名称,则脚本仍然可以正常工作,但缺少“自己”密码的名称将与列表中的最后一个密码配对。 (如果脚本也没有问题names少于密码。在这种情况下,将不会使用“孤立”密码。)
UPDATE
如果您想直接从目录中读取子文件夹名称,从而放弃filenames.txt
文件,您可以像这样更改脚本:
@ECHO OFF
SET arch="C:\Program Files (x86)\WinRAR\WinRAR.exe"
SET "rootdir=D:\path\to\folders"
SET "namestxt=filenames.txt"
SET "passtxt=passwords.txt"
FOR /D %%D IN ("%rootdir%\*") DO (
<"%%D\%passtxt%" (
FOR /D %%N IN ("%%D\*") DO (
SET /P "pass="
SETLOCAL EnableDelayedExpansion
%arch% a -m0 -r -ep1 -hp!pass! "%%N.rar" "%%N"
ENDLOCAL
)
)
)
UPDATE 2
如果你想生成filenames.txt
要从目录中动态读取名称的文件,只需将一个命令插入到第一个脚本的外循环中:
@ECHO OFF
SET arch="C:\Program Files (x86)\WinRAR\WinRAR.exe"
SET "rootdir=D:\path\to\folders"
SET "namestxt=filenames.txt"
SET "passtxt=passwords.txt"
FOR /D %%D IN ("%rootdir%\*") DO (
DIR /AD /B "%%D" >"%%D\%namestxt%"
<"%%D\%passtxt%" (
FOR /F "usebackq delims=" %%N IN ("%%D\%namestxt%") DO (
SET /P "pass="
SETLOCAL EnableDelayedExpansion
%arch% a -r -ep1 -hp!pass! "%%D\%%N.rar" "%%D\%%N"
ENDLOCAL
)
)
)
The /AD
开关DIR
确保仅包含文件夹名称。
请注意,您可以以类似的方式生成密码。如果有一个命令接受输出文件名作为参数并且不间断地完成工作,则可以将该命令插入到DIR
.