Batch file 如何使用批处理程序为PDF文件生成随机密码

Batch file 如何使用批处理程序为PDF文件生成随机密码,batch-file,passwords,pdf-generation,Batch File,Passwords,Pdf Generation,我需要一些帮助。我目前正在执行一个批处理程序,该程序执行以下操作: 在\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_000200.txt 必须使用命令行将所有文本文件单独转换为PDF。为了解决这个问题

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

在\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_000200.txt

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

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

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

    • 为了解决第2和第3项,我安装了程序PDFTK(或PDF工具包)。它具有命令行功能,可以将PDF文件与不同的参数组合在一起,包括将密码添加到PDF文件中。下面一行显示了如何将多个PDF文件合并为一个文件,以及如何向PDF文件中添加随机密码
  • pdftk*%%i.pdf cat输出R\uu%%i.pdf所有者\u pw%random%

  • 最后,应创建一个日志文件(.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
    

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

    解决方案是使用语句调用
    延迟扩展

    SETLOCAL ENABLEDELAYEDEXPANSION
    
    @echo关闭后

    然后您需要通过访问
    来访问
    随机
    的变化值!随机的而不是
    %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
    
    当然,您需要
    !通过
    not
    %pass%
    访问
    pass
    的新值,因为它在循环中变化

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

    set pass=!random!!random!!random!!random!!random!!random!
    
    传递
    设置为6到30位的字符串

    set pass=!pass:~0,8!
    
    将选择这些字符中的前8个。(少于8个字符的概率非常低)


    编辑20130718T1446Z

    嗯,有趣的小冒险。我刚刚解决了密码问题,这无疑是被以下语句误导了:“实际上,生成随机密码并将其存储到CSV文件是我遇到问题的地方”

    好的-首先,没有必要同时列出*.txt和*.pdf。TXTtoPDF可执行文件只处理*.txt。然后熟食店。。。是的-将字母整齐地放在那里,去掉了前导字母和下划线,只留下数字部分

    所以。。。为什么重复?首先,
    dir
    将检查当前目录并构建匹配文件的列表,(我将截断)a_001、a_002、a_003…B_001、B_002…F_001、F_002、F_003,然后FOR将挑选001002003…001002003…001002003并处理它们。因此,001、002、003分别被处理6次。任何特定数字的最终处理将导致执行A_uu、B_u、…F_u,覆盖先前的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
    
    (好的-我已经删除了消息块frippery…)

    最初,
    prevsuff
    是st to
    ——一个不可能是文件名的非空字符串。然后执行
    目录
    ,查找与
    ?*.txt
    匹配的所有文件,该列表按字母顺序排列在第二列--
    *.txt
    上。因此,当
    FOR
    处理数据时,将显示所有编号部分分组的行。它将前缀字母应用于
    %%i
    ,将数字部分应用于
    %%j
    ,因为
    delims
    中有
    。delims中的
    %%j

    (好的,好的-这可能是编写的
    tokens=2delims=.
    ,它将数字部分应用于
    %%i
    -针对感兴趣的人的练习…)

    现在,如果数字部分(
    %%j
    )与
    prevsuff
    中的
    先前后缀
    不匹配,则我们