【问题标题】:Batch Script merging PDF's with pdftk将 PDF 与 pdftk 合并的批处理脚本
【发布时间】:2017-09-16 00:43:38
【问题描述】:

提前感谢您提供的任何帮助。

在搜索所有相关线程和谷歌搜索后,我很难找到一种解决方案来输出用于合并两个 PDF 的变量名。

所以我需要将 100 个 PDF 合并(一次两个)到一个文件夹 c:/test

文件如下所示

Company Name Invoice No 123456
Company Name Invoice No 123456 details

现在我设法一次将两个文件移动到不同的文件夹并合并它们,但似乎无法获得我想要的输出名称,即在前面(或在end, not fused) 第一个合并的文件名。下面是我迄今为止的代码,但输出文件名是空白的,但被创建了。

对批处理脚本非常陌生,希望有任何帮助:)

@echo off

setlocal enableextensions enabledelayedexpansion
set pdftk=C:\Program Files (x86)\PDFtk Server\bin\pdftk.exe

set Source=C:\test
set Target=C:\test\test2
set num=2
set filenumber=1

for /F "tokens=1,2 delims=:" %%f in ('dir /b /a-d "%source%\*.pdf"  ^|     findstr /n "^" ') do (
    if %%f leq %num% (
        copy "%source%\%%g" "%target%" /y > nul 
    ) else goto endCopy
)

:endCopy
endlocal
for /F "tokens=1,2 delims=:" %%f in ('dir /b /a-d "%target%\*.pdf"  ^|      findstr /n "^" ') do (
    if %%f leq %filenumber% ( set file=%%~nA
   )
)
pdftk *.pdf cat output we_19_9_2017_%file%.pdf

【问题讨论】:

  • 使用了错误的元变量。设置文件=%%~ng
  • 谢谢,但不幸的是,我仍然得到变量 %file% 的空白输出
  • 删除 SETLOCALENDLOCAL 行。您正在使用的代码不需要它们。在 endlocal 语句之后不再定义 %filenumber% 变量。

标签: batch-file pdf pdftk


【解决方案1】:

endCopy 中,您尝试获取A 的名称,而您正在使用f 进行迭代。使用set file=%%~nf 设置文件名或使用set file=%%~ng 设置第二个文件。

然后移动末尾的endlocal 以在脚本末尾扩展!file!,如下所示(注意!):

:endCopy
set "cmd=dir /b /a-d "%target%\*.pdf" ^| findstr /n "^""
for /F "tokens=1,2 delims=:" %%f in ('%cmd%') do if %%f leq %filenumber% set file=%%~nf

pdftk *.pdf cat output we_19_9_2017_!file!.pdf
endlocal

阅读更多关于延迟扩展的信息:https://ss64.com/nt/delayedexpansion.html

【讨论】:

  • 感谢@S.Ahmad 提供的信息和建议,我已经按照您的建议修改了我的代码,但我仍然得到一个空白的输出文件。我在控制台中运行了您的代码并收到错误“FINDSTR:无搜索字符串”,我尝试了一些更改,但没有运气......对这个错误有什么想法吗?感谢您的帮助!
  • @manitou 在脚本中将双引号传递给findstr,这会返回此错误:dir /b | findstr /N "" FINDSTR: No search strings 您应该在"^" 之间添加要搜索的字符串,例如"file^"
【解决方案2】:

最后一个命令不使用输入文件的目标文件夹,因此在当前文件夹中查找输入文件,因此要么包含路径,要么首先更改目标路径。

您还为 pdftk 设置了一个路径变量,但不要使用它。
如果此路径未包含在 %path% 中,则无法找到。

试试这个(未经测试)

@echo off
setlocal enableextensions enabledelayedexpansion
set "pdftk=C:\Program Files (x86)\PDFtk Server\bin\pdftk.exe"

set "Source=C:\test"
set "Target=C:\test\test2"
set num=2
set filenumber=1

for /F "tokens=1,2 delims=:" %%f in (
    'dir /b /a-d "%source%\*.pdf" ^| findstr /n "^" '
) do if %%f leq %num% (
    copy "%source%\%%g" "%target%" /y > nul 
) else goto endCopy

:endCopy
endlocal
for /F "tokens=1,2 delims=:" %%f in (
    'dir /b /a-d "%target%\*.pdf" ^|findstr /n "^" '
) do if %%f leq %filenumber% set file=%%~nf

PushD "%Target%"
"%pdftk%" *.pdf cat output we_19_9_2017_%file%.pdf
PopD

【讨论】:

  • 感谢@LotPings,当输出文件时,变量 %file% 表示为“1”,即 we_19_9_2017_1。我做错了吗?
  • 您最初将 filenumber 设置为 1,最后一个 if 禁止使其变大,那么您期望什么?
猜你喜欢
  • 2013-05-15
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多