BAT文件根据文件名合并PDF文件

BAT文件根据文件名合并PDF文件

我一直在尝试使用 BAT 文件将具有相似文件名的 PDF 合并在一起。我使用的方法是使用 pDFTK 快捷方式,选择要合并的 PDF,然后“发送到”快捷方式。但是,我正在尝试找到一种方法来在具有通用名称的文件夹/文件中自动执行此操作。当我运行我的 BAT 文件时,即使它说明了输出应该是什么,也没有输出。当我尝试定义 pdftk.exe 文件时,我在开始时收到字符限制通知(由我定义 PDFTK.exe 位置引起),然后在假定的输出后出现“文件未找到”错误。您能看出这有什么问题吗?为什么它不起作用?我甚至尝试使用同一文件夹中的 pdftk exe 和 dll。

@echo off
setlocal enabledelayedexpansion

rem source root folder where to crawl pdfs.
set "source=F:\Sabine_To_Galveston_Project\ZZ_File_Transform\154482.0"

rem destination folder
set "destination=F:\Sabine_To_Galveston_Project\ZZ_File_Transform\154482.0\Merged"

for /f "delims=" %%a in ('dir /b /s /ad /o:n "%source%"') do (
set _pdffiles=
for /f "delims=" %%i in ('dir /b /a-d /o:n "%%a\*.pdf"') do (
set _pdffiles=!_pdffiles! "%%i"
set "_outputpdf=%%~ni"
)
echo pdftk.exe !_pdffiles! cat output "%destination%\!_outputpdf:~0,6!.pdf"
)

答案1

@echo off && setlocal enabledelayedexpansion

mode 60,3 && color 0a && title <nul && title Merging ...\*.PDF

rem :: check if bat in sendTo folder, also check if argument == false
if not exist "%userprofile%\AppData\Roaming\Microsoft\Windows\SendTo\%~nx0" (
     cd /d "%userprofile%\AppData\Roaming\Microsoft\Windows\SendTo" >nul 2>&1
     <con: copy "%~dpnx0" "!CD!\" && call "%~nx0" "%~1"| endlocal && goto:eof
     )else if "%~1"=="" timeout.exe -1 && echo\Argumment Missing. && goto:eof

rem :: set ful path\file.exe 
set "_pdftk=\The_\Full_\Path_\To_\File_\pdftk.exe"

rem :: check and goto your folder:
>nul 2>nul cd /d "%~dpnx1" || <con: ^< nul ^
     echo\Folder do not exist.. && timeout.exe -1 && goto :^(

rem :: run in your folder  
if exist "!cd!\*.pdf" (
     for /f tokens^=* %%i in ('echo\"!cd!"')do set "_n=%~dpnx1\Merged\%%~nxi" && <nul ^
         call "!_pdftk!" "%%~dpnxi\*.pdf" cat output "!_n:~0,-6!.pdf"
    )

rem :: run in all subfolder 
for /r /d %%i in (*)do echo\"%%~nxi"|find/i /v "Merged" >nul && if exist "%%~i\*.pdf" (
     set "_n=%~dpnx1\Merged\%%~nxi" && call "!_pdftk!" "%%~dpnxi\*.pdf" cat output "!_n:~0,-6!.pdf"
    )

:^(
endlocal & goto=:EOF

这是为了检查 bat 本身是否在\sendto文件夹中,如果条件为假,则将其复制到该\sendto文件夹​​并再次调用执行并传递相同的参数 o(如果已传递),如果条件为真,则继续执行。


  • 选项/d /r没有记录,但可以是一个有用的组合,虽然它会递归遍历所有子文件夹通配符仅与文件夹/目录名称匹配(不是文件名)。

相关内容