吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12154|回复: 34
收起左侧

[原创工具] 用脚本实现qpdf批量查找并解密pdf文件

  [复制链接]
hfxiang 发表于 2019-12-26 10:51
用脚本实现qpdf批量查找并解密pdf文件

qpdf(见:https://sourceforge.net/projects/qpdf/files/qpdf/)是费用的pdf解密工具,但其命令行方式使用起来不够方便,故在自用时写了个bat脚本实现qpdf批量查找并解密pdf文件,同时给出执行状态(运行后建立Success.log及Fail.log,备查)。

本bat脚本达400行,让同事测试时,认为使用不方便,故将其转换为exe可执行文件,更符合使用习惯。

脚本操作说明:
1.可用拖放文件(夹)到脚本上(或其快捷方式上)启动(推荐拖放方式),亦可直接启动后手工录入完整文件(夹)路径进行使用。
2.拖放文件夹到本脚本上(或其快捷方式上),则将对该文件夹内(含子文件夹)所有的pdf文件进行加密检查,在确切知道打开密码的情况下,可移除打开密码(打开密码无法破解,手工输入后可移除),如能打开,则可移除编辑限制密码(无需知道密码)。
3.拖放非pdf文件到本脚本上(或其快捷方式上),则处置该文件所在的文件夹,功能同上。
4.拖放pdf文件到本脚本上(或其快捷方式上),则对该pdf文件(含子文件夹中同名文件)进行加密检查,功能同上。
5.移除密码后的文件名加添_Password_Removed标识,与原文件放置于同一文件夹,故需对该文件夹有读定权限。
6.脚本运行期间把“剪贴板空间”作为临时数据交换区,故此时不得使用剪贴板,即不能有“剪切”、“复制”、“粘贴”(含对应的快捷方式)操作!!否则结果将不可预知!!!
7.脚本将忽略含特殊字符(如&、!、%、^等)的文件, 这类文件不符合本脚本批量处置的要求,请在DOS窗口使用qpdf.exe命令行方式直接处置。
8.本脚本放置于与qpdf.exe同一文件夹之内,在Win10下测试成功。建议建立qpdf_Script.exe的快捷方式,并copy至需解密的文件夹内用拖放方式使用更方便。
qpdf_Script.jpg

qpdf_Script.rar

55.09 KB, 下载次数: 472, 下载积分: 吾爱币 -2 CB

免费评分

参与人数 12吾爱币 +17 热心值 +11 收起 理由
banery + 1 + 1 很方便的工具
wj710000 + 1 + 1 谢谢@Thanks!
jiucheng233 + 1 + 1 热心回复!
芥末就酱 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
★天若有情★ + 1 + 1 我很赞同!
x_killua + 1 + 1 谢谢@Thanks!
18023999 + 1 + 1 挺狠
52pojiewang52 + 1 + 1 感谢大佬,我试试啊
青山枯叶 + 1 谢谢@Thanks!
秋雨凉心 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
mikezhql + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Hmily + 6 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

mynccs 发表于 2020-1-10 20:01


提取了bat。分享给大家
[Asm] 纯文本查看 复制代码
@shift /0
@echo off
setlocal
setlocal enableextensions enabledelayedexpansion

[url=home.php?mod=space&uid=251666]@rem[/url] 记录开始时间
set start_time=%time:~0,8%

@rem 记录器初始化
set /a "n0=0"
set /a "n1=0"
set /a "n2=0"
set /a "n3=0"
set /a "n4=0"
set /a "n5=0"
set /a "n5e=0"
set /a "n6=0"
set /a "n6e=0"
set /a "n7=0"
set /a "n8=0"
set /a "n9=0"
set /a "n10=0"

@rem 初始化powershell命令(脚本)
set "Clip_Script=add-type -as System.Windows.Forms; [windows.forms.clipboard]::GetText()"

@rem 传递并检测系统参数
set pt=%1
if not '%pt%' =='' goto next2

:next1
cls
echo;
set /p pt= 请指定待解密的pdf文件或文件夹(如:"%~dp0待解密文件.pdf" ):
if '%pt%' =='' goto next1

:next2
@rem # 脱去变量pt串中可能出现的所有引号(先强行增加引号,再去除所有引号)
set pt="%pt%"
set "pt=%pt:"=%"

if /i "%pt%" =="" goto next1

@rem # 拆分输入路径为:盘符、路径、文件名、扩展名、属性、合格路径、大小、修改时间
set Dir_i=%pt%
call :Dir_split "%Dir_i%" Dir_d Dir_p Dir_n Dir_x Dir_a Dir_f Dir_z Dir_t
if /i "%Dir_a%"=="" echo;&echo;指定的文件名含与本脚本命令相冲突的字符(如^&、^^!、%%、^^^^等特殊字符),无法往下执行,请修改文件名后再调用本脚本。&echo;请按任意键退出脚本&goto next3
rem echo Dir_i="%Dir_i%"
rem echo Dir_d="%Dir_d%"
rem echo Dir_p="%Dir_p%"
rem echo Dir_n="%Dir_n%"
rem echo Dir_x="%Dir_x%"
rem echo Dir_a="%Dir_a%"
rem echo Dir_f="%Dir_f%"
rem echo Dir_z="%Dir_z%"
rem echo Dir_t="%Dir_t%"

@rem 设定待解密的pdf所在的文件夹
set "pdfDir=%Dir_d%%Dir_p%"

@rem 删除文件名中可能出现的"_Password_Removed"
if not "%Dir_n%"=="" set Dir_n=%Dir_n:_Password_Removed=%

@rem 1.如果输入是文件夹
if /i "%Dir_a:~0,1%"=="d" (
if /i not "%Dir_n%"=="" (set "pdfList=%Dir_d%%Dir_p%%Dir_n%\*.pdf") else (set "pdfList=%Dir_d%%Dir_p%*.pdf")
set "pdfDir=%Dir_d%%Dir_p%%Dir_n%"
set "pdfFilesName=*.pdf"
)

@rem 2.如果输入是文件
if /i not "%Dir_a:~0,1%"=="d" (

@rem 2.1.扩展名转换为小写
for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do call set Dir_x=!!Dir_x:%%i=%%i!!

@rem 2.2.输入是pdf文件
if /i "!Dir_x!"==".pdf" (
set "pdfList=!Dir_d!!Dir_p!!Dir_n!!Dir_x!"
set "pdfFilesName=!Dir_n!*.pdf"
)

@rem 2.3.输入不是pdf文件
if /i not "!Dir_x!"==".pdf" (
set "pdfList=!Dir_d!!Dir_p!*.pdf"
set "pdfFilesName=*.pdf"
)
)

@rem 2.4.如果不是根目前,则删除最后的反斜杠“\”
if /i "%pdfDir:~-1,1%"=="\" if /i not "%pdfDir:~-2,1%"==":" set "pdfDir=%pdfDir:~0,-1%"

@rem 2.5.测试文件夹是否真实存在
if not exist "%pdfDir%" echo;&echo;指定的文件夹"%pdfDir%"不存在&echo;请按任意键退出脚本&goto next3

@rem 2.6.如果指定的是具体的pdf文件,则首先测试该文件是否真实存在
if /i "%Dir_x%"==".pdf" (
if not exist "%pdfList%" echo;&echo;指定的pdf文件"%pdfList%"不存在&echo;请按任意键退出脚本&goto next3
)

@rem 2.7.设置log文件
if /i "%pdfDir:~-1,1%"=="\" (
set R_Su=%pdfDir%Success.log
set R_Fa=%pdfDir%Fail.log
echo 文件所在目录:%pdfDir% >"!R_Su!"
echo 文件所在目录:%pdfDir% >"!R_Fa!"
) else (
set R_Su=%pdfDir%\Success.log
set R_Fa=%pdfDir%\Fail.log
echo 文件所在目录:%pdfDir%\ >"!R_Su!"
echo 文件所在目录:%pdfDir%\ >"!R_Fa!"
)

::echo;测试成功,请按任意键退出脚本&endlocal&pause>nul&&exit /b

echo 开始时间:%start_time% >>"%R_Su%"
echo 开始时间:%start_time% >>"%R_Fa%"
echo 成功移动编辑或打印限制密码的文件:>>"%R_Su%"
echo 密码移除失败的文件:>>"%R_Fa%"
::echo;测试成功,请按任意键退出脚本&endlocal&pause>nul&&exit /b

echo;
echo;!注意!
echo;1.脚本运行期间不得使用剪贴板,
echo;  即不能有“剪切”、“复制”、“粘贴”(含对应的快捷方式)操作!!
echo;  否则结果将不可预知!!!
echo;
echo;2.脚本将忽略含特殊字符(如^&、^^!、%%、^^^^等)的文件,
echo;  这类文件不符合脚本批量处置的要求,请在DOS窗口使用命令行方式直接处置。
echo;

for /r "%pdfDir%" %%a in ("%pdfFilesName%") do (
set "p1=0"
set "error00=0"
set "error01=1"
set fpi="%%~fa"
set fpo="%%~da%%~pa%%~na_Password_Removed%%~xa"

@rem 剔除含特定字符(如^&、^^!、%%、^^^^等)的文件(冲突)
if /i "!error00!"=="0" (
echo "%%~fa"|find.exe /i "&">Nul && ( set "error00=1"&&set /a "n6=!n6!+1" ) || ( set "error01=0" )
)
if /i "!error00!"=="0" (
echo "%%~fa"|find.exe /i "!">Nul && ( set "error00=1"&&set /a "n6=!n6!+1" ) || ( set "error01=0" )
)
if /i "!error00!"=="0" (
echo "%%~fa"|find.exe /i "%">Nul && ( set "error00=1"&&set /a "n6=!n6!+1" ) || ( set "error01=0" )
)
if /i "!error00!"=="0" (
echo "%%~fa"|find.exe /i "^">Nul && ( set "error00=1"&&set /a "n6=!n6!+1" ) || ( set "error01=0" )
)
if !n6! gtr !n6e! (set /a "n6e = !n6!" &&echo; 冲突:!fpi!&&echo;&&echo; 冲突:!fpi!>>"%R_Fa%")

@rem 剔除特定文件(忽略)
if /i "!error00!"=="0" (
echo;"%%~fa"|find.exe /i "\Recovery\">Nul && ( set "error00=1"&&set /a "n5=!n5!+1" ) || ( set "error01=0" )
)
if /i "!error00!"=="0" (
echo;"%%~fa"|find.exe /i "\$Recycle.Bin\">Nul && ( set "error00=1"&&set /a "n5=!n5!+1" ) || ( set "error01=0" )
)
if /i "!error00!"=="0" (
echo;"%%~fa"|find.exe /i "_Password_Removed">Nul && ( set "error00=1"&&set /a "n5=!n5!+1" ) || ( set "error01=0" )
)
if !n5! gtr !n5e! (set /a "n5e = !n5!" &&echo; 忽略:!fpi!&&echo;&&echo; 忽略:!fpi!>>"%R_Fa%")

@rem # 脱去变量fpi\fpo串中可能出现的所有引号(先强行增加引号,再去除所有引号)
if /i "!error00!"=="0" (
set "fpi=!fpi:"=!"
set "fpo=!fpo:"=!"
)

if /i "!error00!"=="0" (
if not exist "!fpi!" (
set "error00=1"
set /a "n0=!n0!+1"
) else (
set /a "n9=!n9!+1"
echo 第 !n9! 个文件
echo 正在对 "!fpi!" 进行处置)
)

if /i "!error00!"=="0" (
call :Dir_split "!fpi!" Dir_err Dir_err Dir_err Dir_err Dir_a Dir_err Dir_err Dir_err
if /i "!Dir_a!"=="" set "error00=1"&&set /a "n5=!n5!+1"
)

if /i "!error00!"=="0" (
qpdf.exe --show-encryption "!fpi!" 2>&1 |clip.exe
)
@rem 0文件不存在
if /i "!error00!"=="0" (
powershell -sta "%Clip_Script%"|find.exe /i "No such file or directory">Nul && ( set "error00=1"&&set /a "n0=!n0!+1"&&set "p1=No such file or directory" ) || ( set "error01=0" )
)
@rem 1文件没加密
if /i "!error00!"=="0" (
powershell -sta "%Clip_Script%"|find.exe /i "File is not encrypted">Nul && ( echo;       "!fpi!" 无密码。&&echo;&&set "error00=1"&&set /a "n1=!n1!+1"&&set "p1=File is not encrypted" ) || ( set "error01=0" )
)
@rem 2文件故障
if /i "!error00!"=="0" (
powershell -sta "%Clip_Script%"|find.exe /i "file is damaged">Nul && ( echo;       "!fpi!" 文件故障或损坏。&&echo;&&set "error00=1"&&set /a "n2=!n2!+1"&&set "p1=file is damaged" &&echo; 故障:"!fpi!">>"%R_Fa%") || ( set "error01=0" )
)
@rem 3文件带打开密码
if /i "!error00!"=="0" (
powershell -sta "%Clip_Script%"|find.exe /i "invalid password">Nul && ( set "error00=0"&&set /a "n3=!n3!+1"&&set "p1=invalid password" ) || ( set "error01=0" )
)
@rem 4文件无打开密码,但部分限制编辑或打印功能
if /i "!error00!"=="0" (
powershell -sta "%Clip_Script%"|find.exe /i "print high resolution">Nul && ( set "error00=0"&&set /a "n4=!n4!+1"&&set "p1=print high resolution" ) || ( set "error01=0" )
)

rem echo error00="!error00!"
rem echo p1="!p1!"
rem powershell -sta "%Clip_Script%"

if /i "!p1!"=="invalid password" (
	set /p ps= 请指定 "!fpi!" 打开密码:
	echo;
	qpdf.exe --password="!ps!" --decrypt "!fpi!" "!fpo!" >nul 2>&1
	if !errorlevel! equ 0 (set /a "n8=!n8!+1"&echo;       "!fpi!" 解密成功&echo;&echo "!fpi!">>"%R_Su%") else (set /a "n7=!n7!+1"&echo;       "!fpi!" 解密失败???&echo;&echo 需打开密码:"!fpi!">>"%R_Fa%"))
if /i "!p1!"=="print high resolution" (
	qpdf.exe --decrypt "!fpi!" "!fpo!"
	if !errorlevel! equ 0 (set /a "n8=!n8!+1"&echo;       "!fpi!" 解密成功&echo;&echo "!fpi!">>"%R_Su%") else (set /a "n7=!n7!+1"&echo;       "!fpi!" 解密失败???&echo;&echo "!fpi!">>"%R_Fa%"))
)

set /a "n10=%n9%+%n5%+%n6%"
echo;
echo;扫描有效文件数:%n9%
echo;
echo;成功解密文件数:%n8%
echo;
echo;带打开密码文件数:%n3%
echo;
echo;只限制编辑或打印文件数:%n4%
echo;
echo;解密操作失败文件数:%n7%
echo;
echo;解密检测时出现故障(或损坏)文件数:%n2%
echo;
echo;未加密文件数:%n1%
echo;
echo;被忽略(或无效或不存在)文件数:%n5%
echo;
echo;文件名与脚本特定字符(如^&、^^!、%%、^^^^等)冲突的文件数:%n6%
echo;
echo;不存在的文件(可能是“For”指令本身特性及脚本其它未知项引发而产生不存在文件名):%n0%
echo;
echo;总检测文件数(可能存在):%n10%
echo;

echo; >>"%R_Su%"
echo; >>"%R_Fa%"
echo;共扫描了%n9%个效文件(可能共有%n10%个pdf文件) >>"%R_Su%"
echo;共扫描了%n9%个效文件(可能共有%n10%个pdf文件) >>"%R_Fa%"

@rem 耗时计算
set /a startS=%start_time:~6,2%
set /a startM=%start_time:~3,2%
set /a startH=%start_time:~0,2%
set /a totalSs=%startS%+%startM%*60+%startH%*60*60
set end_time=%time:~0,8%
set /a endS=%end_time:~6,2%
set /a endM=%end_time:~3,2%
set /a endH=%end_time:~0,2%
set /a totalSe=%endS%+%endM%*60+%endH%*60*60
set /a diff_total_S=%totalSe%-%totalSs%
if %diff_total_S% lss 0 (set /a diff_total_S=24*60*60+%totalSe%-%totalSs%)
set /a diffH_=%diff_total_S% / 3600
set /a diffM_=%diff_total_S% %% 3600
set /a diffS_=%diffM_% %% 60
set /a diffM_=%diffM_% / 60

echo 开始时间:%start_time%
echo 完成时间:%end_time%
echo 耗时:%diffH_%小时 %diffM_%分钟 %diffS_%秒

echo 完成时间:%end_time% >>"%R_Su%"
echo 耗时:%diffH_%小时 %diffM_%分钟 %diffS_%秒 >>"%R_Su%"
echo 完成时间:%end_time% >>"%R_Fa%"
echo 耗时:%diffH_%小时 %diffM_%分钟 %diffS_%秒 >>"%R_Fa%"
echo;
endlocal
echo 执行完成,按任意键(建议按"空格键")退出......
pause>nul
@rem # 退出
exit /b
:next3
endlocal
pause>nul
exit /b
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Dir_split %Dir_i% Dir_d Dir_p Dir_n Dir_x Dir_a Dir_f  Dir_z Dir_t
:: 功能:拆分输入路径为:盘符、路径、文件名、扩展名
:: 参数:%1 输入全路径
::       %2 输出:盘符
::       %3 输出:路径
::       %4 输出:文件名
::       %5 输出:扩展名
::       %6 输出:属性(文件or文件夹)
::       %7 输出:合格的路径名
::       %8 输出:文件大小
::       %9 输出:文件时间
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
endlocal&set %2=%~d1&set %3=%~p1&set %4=%~n1&set %5=%~x1&set %6=%~a1&set %7=%~f1&set %8=%~z1&set %9=%~t1&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
endlocal
@echo on
bachelor66 发表于 2019-12-26 11:53
Hmily 发表于 2019-12-26 10:54
这东西打包其实运行还是释放bat,还不如bat方便。。。
mikezhql 发表于 2019-12-26 11:06
有时间试试看,再做评论,谢谢分享
吾爱师姐! 发表于 2019-12-26 11:12
表示不能用,求解
 楼主| hfxiang 发表于 2019-12-26 11:17

请把本脚本放置于与qpdf.exe在同一文件夹之内
吾爱师姐! 发表于 2019-12-26 11:31
hfxiang 发表于 2019-12-26 11:17
请把本脚本放置于与qpdf.exe在同一文件夹之内

file:///C:/Users/Administrator/Desktop/QQ%E5%9B%BE%E7%89%8720191226111558.png,是不是操作不对
吾爱师姐! 发表于 2019-12-26 11:36
脚本不是内置在EXe里面了吗
QQ图片20191226111558.png
 楼主| hfxiang 发表于 2019-12-26 11:41
吾爱师姐! 发表于 2019-12-26 11:36
脚本不是内置在EXe里面了吗

脚本不含工具。
工具需自行下载:https://sourceforge.net/projects/qpdf/files/qpdf/
吾爱师姐! 发表于 2019-12-26 11:58
hfxiang 发表于 2019-12-26 11:41
脚本不含工具。
工具需自行下载:https://sourceforge.net/projects/qpdf/files/qpdf/

经测试可以用了,您这个必须放到https://sourceforge.net/projects/qpdf/files/qpdf/下载的脚本qpdf-9.1.0-bin-mingw32文件的qpdf-9.1.0-bin-mingw32\qpdf-9.1.0\bin位置,才可以用,打开密码不能用这个破解,
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表