在一组文件中使用密码压缩(WinRAR)

4
我会尽量简短地说明。我正在寻找一个.bat文件,用于将包含文件的文件夹压缩并设置密码,但问题比我想象的要棘手得多,每个文件夹中可能有1到400个文件,我有两个.txt文件,一个带有所需数量的.rar文件名,另一个带有所需数量的.rar密码,因此txt文档如下,第一个是filenames.txt:
FAD01    
FAD02    
FAD03

一直到 FAD110 等等。

还有另一个 .txt 文件。

GAP01
GAP02
GAP03
GAP04
GAP05

一直到为止

第一个密码.txt文件的样式如下:

vF2RiQMof6HSWy8MSEIO
13qIsZ7e9RIzBwaQ3UO6
KfTMk9wPfPQKMNh4XzD8

等等,总共有110个随机密码。

第二个密码.txt文件如下所示:

al9p4O2vkiqcFKfgpWh7
U0jkx05nQoTKPAAPEYiW
43bliny0TU2R4CKob62H

等等,总共会有50个随机密码

我的意图是将.txt文件中的第一个50个文件名列表应用于主文件夹中的50个子文件夹,并使用50个密码中的第一个列表来创建每个.rar文件,所以我的最终结果是>在第一个主文件夹内有50个rar文件,每个文件都有不同的密码。我还希望.rar文件的密码被加密,这样除非您输入密码,否则无法查看任何.rar文件的内容。

最终结果如下:

FAD01.rar > password = vF2RiQMof6HSWy8MSEIO
FAD02.rar > password = 13qIsZ7e9RIzBwaQ3UO6
FAD03.rar > password = KfTMk9wPfPQKMNh4XzD8

一直到FAD110.rar

如果你认为自己能行,或者你想挑战一下并且有一颗善良的心,我愿意付钱给你 :) 谢谢你抽出时间来阅读我的问题。

额外信息

我创建了文件名和密码列表来帮助生成有密码的rar文件,但是如果您可以在不需要预定义密码/文件名列表的情况下完成,则需要做更少的工作,但我需要某种文件名/密码列表通过.bat文件创建,以便我知道什么。 .rar有什么密码。

这些列表很容易生成,因此我希望bat文件可以逐行读取列表,并将文件名和密码应用于要rar的文件夹

基本上,我希望它按字母顺序对一组文件夹进行单独的rar处理,并对rar应用随机密码(这些密码应为20个字符,并包含数字和大写/小写字母),但我希望rar加密,这是winRAR中的一个选项,它可以防止用户在输入密码之前看到rar的内容

每个包含多个文件的50到300个文件夹,需要rar并使用随机加密密码进行密码保护,我目前正在逐个处理它们,非常耗时。


我肯定愿意尝试一下,因为我喜欢挑战 :) 但是你能否重新措辞一下,解释一下为什么你有4个不同的txt文件,以及你想要密码保护哪些内容? - Bali C
仍然不清楚为什么有四个文本文件,更确切地说,是两对(文件名+密码)的文件。我的意思是,如果需要处理两个(或更多)对,那就没问题了,但从您的描述中似乎不明确。然后,这些列表文件的名称是否遵循任何模式以便脚本能够识别它们也不清楚。 - Andriy M
事实上,你的示例中第一个文本文件据说包含110个项目,但后来你引用它时却说它只包含50个项目,这更加令人困惑。也许你只是把数字与另一个列表中的数字混淆了(你确实说过第二个列表包含50个项目)。或者你真的是指50个吗?比如说,110个项目中的前50个?但这又需要解释“为什么”的原因。 - Andriy M
有数百个带有目录的文件夹,每个文件夹中可以包含50-400个目录,因此我制作了数十个txt文件,每个文件夹有两个txt文件,一个包含文件名(逐行)和另一个包含密码(逐行)。我使用这些列表来重命名目录并为其设置密码,一次只处理一个。 - David Axwell
文本文件不是问题,如果您可以创建一个批处理文件,将文件夹中的所有目录压缩为rar格式,并使用随机生成的密码(密码长度为20个字符,至少包含1个大写字母、1个小写字母和1个数字,并加密以便RAR文件内容无法在未输入密码的情况下查看),那就是我想要的 :) - David Axwell
有没有一种方法可以在没有根目录的情况下完成这个操作?假设您有十个文件夹1-10,它会解析所有十个文件夹并将rar文件转储到与批处理存在于同一“根”文件夹中? - user1741446
1个回答

3
假设有以下目录结构:
\
└─SomeRootFolder
  ├─SuperfolderA
  │ ├─filenames.txt
  │ ├─passwords.txt
  │ ├─A1
  │ │ └─...
  │ ├─A2
  │ │ └─...
  │ └─...
  ├─SuperfolderB
  │ ├─filenames.txt
  │ ├─passwords.txt
  │ ├─B1
  │ │ └─...
  │ ├─B2
  │ │ └─...
  │ └─...
  └─...

(子文件夹A1A2,... B1B2等需要放入它们自己的归档文件中),以下对我有用:

@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)遍历您的“超级文件夹”,其中包含要归档的子文件夹和文本文件。
该循环的内容以以下方式读取两个文件:
1. filenames.txt由内部循环指令本身(for /f命令)读取; 2. 密码文件由内部循环体中的一个命令(read)读取。SET / P读取标准输入流,其默认情况下为控制台,但在这种情况下,整个内部循环的标准输入会被重定向为passwords.txt。
因此,%%D循环变量(外部循环)包含到“超级文件夹”的完整路径,%%N分配了子文件夹的名称,而pass则设置为相应的密码。此时,只需调用压缩程序即可。
以下是压缩程序命令行中使用的参数:
- a - 添加命令本身(与提取等命令不同,提取是x,更新是u); - -r - 递归处理指定的文件夹(如果您不需要,可以删除此选项); - -ep - 从名称中排除基本文件夹; - -hp... - 使用指定的密码加密归档文件(与-p...不同,后者仅保护提取; -hp将不允许您在没有密码的情况下查看归档内容,就像您想要的那样)。
您可以看到,在调用压缩程序之前启用了延迟扩展。如果您不了解命令块(其中包括循环体)中“立即”扩展的影响,我只是说,如果变量在分配和扩展同一命令块中,则其不会按照您的期望工作。因此使用延迟扩展。它使用!s而不是% s,并且您可以看到pass变量以这种方式扩展。
还有一件事情需要提到。如果你生成的密码数量少于另一个文件中的名称数量,脚本仍然可以正常工作,但是缺少“自己”的密码的名称将与列表中的最后一个密码配对。(如果名称少于密码也不是问题。在这种情况下,“孤立”的密码就不会被使用。)

更新

如果您想直接从目录中读取子文件夹名称,而放弃使用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
    )
  )
)

更新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
    )
  )
)
/AD switch是DIR命令的一个开关,它确保只包含文件夹名称。
请注意,您可以以类似的方式生成密码。如果有一种单个命令接受输出文件名作为参数,并且在没有中断的情况下完成工作,您可以在DIR之后插入该命令。

@DavidAxwell:请看一下我的更新,我已经描述了脚本所假定的目录结构。如果这是一个错误的假设,请告诉我。此外,您在分配给rootdir的路径中实际使用了正斜杠吗?Windows命令行不太喜欢它们作为路径分隔符,而更喜欢反斜杠。正斜杠有时可以工作,但并非总是如此。 - Andriy M
我做错了什么,这是我拍摄的快照 - http://i34.servimg.com/u/f34/16/04/19/70/captur19.jpg - David Axwell
同时,在脚本开头是否可以添加代码,使其通过扫描文件夹创建自己的filenames.txt文件,并从中创建文件名?这样我只需要为passwords.txt创建密码列表,或者完全取消使用filenames文件并将每个文件夹分别压缩并使用passwords.txt文件作为密码即可。谢谢 - David Axwell
-m<n> 设置压缩方法:-m0 存储 不对文件进行压缩,添加到归档文件中。如果未指定此开关,则RAR使用-m3方法(正常压缩)。 - David Axwell
好的,我现在开始逐渐掌握了这个技巧,在阅读了有关RAR DOS命令的资料后,我将这一行改为- %arch% a -r -ep1 -m0 -hp!pass! "%%D%%N.rar" "%%D%%N",然后整个过程就顺利地进行了。 - David Axwell
显示剩余14条评论

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