0

我需要一些帮助。我目前正在做一个批处理程序,它执行以下操作:

在 \Reports\ 文件夹中存储了几个文本文件。例如,

A_000100.txt、A_000200.txt、B_000100.txt、B_000200.txt、C_000100.txt、C_000200.txt、D_000100.txt、D_000200.txt、E_000100.txt、E_000200.txt、F_000100.txt、F_002

  1. 所有文本文件都必须使用命令行单独转换为 PDF。为了解决这个问题,我安装了“AdultPDF Txt to PDF converter”程序。它具有命令行功能,可将文本文件转换为具有不同参数的 PDF。下面一行显示了如何将文本文件转换为 PDF。在下面的示例代码中,输出 PDF 文件的纸张设置为字母大小 (-pps4),字体大小为 10.9 (-pfs10.9)。

TXTtoPDF A_000100.txt A_000100.pdf -pps4 -pfs10.9

  1. 将每个文本文件单独转换为 PDF 后,应将文件名最后 6 个字符相同的 PDF 文件(例如 A_000100.pdf、B_000100.pdf、C_000100.pdf 等)合并为一个 PDF,并将输出文件名将为 R_000100.pdf。输出的 PDF 文件将存储在同一文件夹中。

  2. 合并后的 PDF 文件(例如 R_000100.pdf)必须使用密码加密,但应该是随机生成的。但是每个合并的 PDF 文件的密码应该彼此不同。

    • 为了解决第 2 和第 3 项问题,我安装了程序 PDFTK(或 PDF ToolKit)。它具有命令行功能,可以将具有不同参数的 PDF 文件组合在一起,包括将密码添加到 PDF 文件中。下面一行显示了如何将多个 PDF 文件合并为一个,并在 PDF 文件中添加随机密码。

pdftk *%%i.pdf cat output R_%%i.pdf owner_pw %random%

  1. 最后,应创建一个日志文件 (.CSV),其中将列出组合 PDF 文件的文件名以及每个 PDF 文件随机生成的密码。下面是我用来执行此操作的代码:

echo %%i R_%%i.pdf %random% >> passwords.csv

实际上,随机密码的生成并将它们存储到 CSV 文件中是我遇到问题的地方。它似乎不起作用。我不知道如何正确地做到这一点。任何精通批处理编程的人都可以帮助我吗?下面是我迄今为止完成的完整批处理程序。如果需要对我的程序进行一些更正以使其更简单,请毫不犹豫地进行更正。对你的帮助表示感谢。谢谢!

@echo off
for /f "tokens=1,2 delims=ABCDEF_." %%i in ('dir *.txt *.pdf /b') do (

TXTtoPDF A_%%i.txt A_%%i.pdf -pps4 -pfs10.9
TXTtoPDF B_%%i.txt B_%%i.pdf -pps4 -pfs8.9
TXTtoPDF C_%%i.txt C_%%i.pdf -pps4 -plm50 -prm50 -pfs7.9
TXTtoPDF D_%%i.txt D_%%i.pdf -pps4 -plm60 -prm60 -pfs8.9
TXTtoPDF E_%%i.txt E_%%i.pdf -pps5 -pot -pfs10
TXTtoPDF F_%%i.txt F_%%i.pdf -pps5 -pot -pfs12
pdftk *%%i.pdf cat output PDF\R_%%i.pdf owner_pw %random%
echo %%i R_%%i.pdf %random% >> passwords.csv

)

echo                ***************************************************
echo                *                                                 *
echo                *       PDF REPORTS SUCCESSFULLY GENERATED.       *
echo                *       PLEASE TYPE EXIT AT COMMAND PROMPT.       *
echo                *                                                 *
echo                ***************************************************
pause
exit
4

1 回答 1

2

延迟扩展 - 在一个块内,包括 %random% 在内的任何 %var% 都被其在块(带括号的语句序列)解析时的值替换。

DELAYED EXPANSION解决方案是使用语句调用

SETLOCAL ENABLEDELAYEDEXPANSION

之后@echo off

那么你需要random通过访问!random!而不是访问不断变化的值%random%

但是您需要向文件发送与密码相同的随机值,并且!RANDOM!每次访问时都会生成一个新值 - 所以您需要将可变随机值放入变量中并使用存储在变量中的可变值作为 CSV 中的密码和数据

set pass=!random!
pdftk *%%i.pdf cat output PDF\R_%%i.pdf owner_pw !pass!
echo %%i R_%%i.pdf !pass! >> passwords.csv

自然,您不需要!pass!访问%pass%新的值,pass因为它在循环中会发生变化。

现在 - 随机数的长度可能是 1-5 位。您可能希望拥有更长或恒定长度的密码

set pass=!random!!random!!random!!random!!random!!random!

将设置pass为 6 到 30 位的字符串。

set pass=!pass:~0,8!

将选择这些字符中的前 8 个。(少于8个字符的概率很低)


编辑 20130718T1446Z

唔。有趣的小冒险。我刚刚解决了密码问题,无疑被声明误导了"Actually, the generation of the random password and storing them into a CSV file is where I'm having a problem"

好的 - 首先,列出 *.txt 和 *.pdf 是没有意义的。TXTtoPDF 可执行文件只会处理 *.txt。然后是 DELIMS ......是的 - 将 alpha 放在那里整齐地摆脱了前导 alpha 和下划线,只留下数字部分。

那么......为什么重复?首先,dir将检查当前目录并构建匹配文件列表,(我将截断)A_001、A_002、A_003...B_001、B_002...F_001、F_002、F_003,然后 FOR 将挑选出 001,002,003。 ..001,002,003...001,002,003 并处理它们。因此,001、002、003 分别被处理 6 次。任何特定数字的最终处理将导致 A_、B_、...F_ 被执行,覆盖以前的 x_999.PDF,因此在任何特定数字的情况下应用的最后一个密码将是最终版本。

修改后的代码:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET prevsuff=::

for /f "tokens=1,2 delims=_." %%i in ('dir ?_*.txt /b ^|sort /+2') do IF NOT !prevsuff!==%%j (
 SET prevsuff=%%j
 IF EXIST A_%%j.txt TXTtoPDF A_%%j.txt A_%%j.pdf -pps4 -pfs10.9
 IF EXIST B_%%j.txt TXTtoPDF B_%%j.txt B_%%j.pdf -pps4 -pfs8.9
 IF EXIST C_%%j.txt TXTtoPDF C_%%j.txt C_%%j.pdf -pps4 -plm50 -prm50 -pfs7.9
 IF EXIST D_%%j.txt TXTtoPDF D_%%j.txt D_%%j.pdf -pps4 -plm60 -prm60 -pfs8.9
 IF EXIST E_%%j.txt TXTtoPDF E_%%j.txt E_%%j.pdf -pps5 -pot -pfs10
 IF EXIST F_%%j.txt TXTtoPDF F_%%j.txt F_%%j.pdf -pps5 -pot -pfs12
 set pass=!random!!random!!random!!random!!random!!random!!random!!random!
 set pass=!pass:~-8!
 pdftk *%%j.pdf cat output PDF\R_%%j.pdf owner_pw !pass!
 echo %%j R_%%j.pdf !pass! >> passwords.csv

)

GOTO :EOF

(好的-我已经放弃了消息块的繁琐......)

最初,prevsuff是 st to ::- 一个不可能是文件名的非空字符串。然后DIR执行 ,查找所有匹配的文件,?_*.txt并且该列表在第二列按字母顺序排序 - _. 因此,在FOR处理数据时,将显示所有 NUMBER 部分分组的行。由于. %%i_ %%j_ __ delims.delims 中删除.txt后缀%%j

(好吧,好吧——这本可以写成tokens=2delims=_.将数字部分应用于%%i——为那些感兴趣的人练习……)

现在,如果数字部分 ( %%j) 与 in 不匹配previous suffixprevsuff那么我们处理这个。首先,我们调整prevsuff到我们将要处理的那个,然后处理它。然后当我们从列表中获得下一个数字时,它会匹配,所以我们跳过直到我们有下一个变化......

如果IF EXIST缺少文件(A_001 存在,但 D_001 不存在...),则 s 将抑制丑陋的消息;8 个随机数被级联pass,因此将分配 8..40 个数字,最后 8 个由!pass:~-8!

从那里开始,它应该是一帆风顺的。

于 2013-07-18T08:40:28.457 回答