我一直在尝试使用 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
没有记录,但可以是一个有用的组合,虽然它会递归遍历所有子文件夹通配符仅与文件夹/目录名称匹配(不是文件名)。