2013-07-18 100 views
0

我需要一些幫助。我目前正在執行批處理程序,它執行以下操作:如何使用批處理程序爲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

  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,這對他們的文件名(例如,A_000100.pdf,B_000100.pdf,C_000100相同的最後6個字符的PDF文件。 PDF等)應該合併成一個PDF文件,輸出文件名將是R_000100.pdf。輸出的PDF文件將存儲在相同的文件夾中。

  2. 組合的PDF文件(例如R_000100.pdf)必須用密碼加密,但應該隨機生成。但每個組合PDF文件的密碼應該彼此不同。

    • 爲了解決項目號2 & 3,I安裝該程序PDFTK(或PDF工具包)。它具有命令行功能,可將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 

回答

2

延遲擴展 - 一個塊內,任何%VAR%,包括%的無規%是由它的值在該塊(parenthesised語句序列)被解析的時間更換。

解決方案是使用如下語句

SETLOCAL ENABLEDELAYEDEXPANSION 

@echo off

之後調用DELAYED EXPANSION THEN則需要通過訪問!random!訪問的random的變化值,而不是%random%

BUT你需要發送相同的隨機va按照用於密碼的文件,!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都沒有意義。只有* .txt將由TXTtoPDF可執行文件處理。然後是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 

(OK-我離開的消息塊frippery ...)

最初,prevsuff是第一至:: - 一個非空字符串,不可能是一個文件名。然後執行DIR,查找與?_*.txt匹配的所有文件,並且該列表在第二列 - _上按字母順序排序。因此,當FOR處理數據時,會將所有NUMBER部分分組。由於delims中的_,它將前綴字母應用於%%i,並將數字部分應用於%%j。在delims的.下降從%%j

.txt後綴(嗯,好吧 - 這可能已被寫入tokens=2delims=_.這將數字部分適用於%%i - 鍛鍊對於那些有興趣...)

現在,如果數字部分(%%j)與previous suffix不匹配prevsuff然後我們處理這一個。首先,我們將prevsuff調整爲我們即將處理的那個,然後對其進行處理。然後,當我們從列表中的下一個號碼,它會匹配,所以我們跳過,直到我們有下一個變化...

IF EXIST s爲抑制醜陋的消息,如果有一個文件丟失(A_001存在,但D_001不...); 8 randoms級聯到pass所以會有8..40位數字分配,最後8是由!pass:~-8!

選擇從那裏,它應該是一帆風順。

+0

非常感謝您的回覆!它真的有效。另外,感謝您提供關於如何擴展密碼長度的代碼以及從密碼中選擇前8個字符的代碼。這是我需要密碼的確切長度。 –

+0

對於我上面發佈的程序,我仍然遇到問題。我認爲我的for循環語句存在問題,因爲在打開文件「passwords.csv」後,我注意到循環重複了5次。例如,R_000100.pdf在第1,3,5,7和9行中使用不同的密碼。但最後一個密碼是正確的。我應該糾正哪些問題,以便在所有PDF文件合併並分配密碼後,程序將已經停止循環並退出?因此在輸出文件「passwords.csv」中只有一個條目,並且不會重複5次。非常感謝! –