遍历目录以从多个 pdf 中提取页面

Looping through directories to extract pages from multiple pdfs

我有多个目录,每个目录包含一个 pdf。我试图从每个 pdf 中提取第 1 页并将其保存在原始 pdf 所在的目录中,所以我最终得到现在包含两个 pdf 的多个目录。

我目前有这段代码使用 ghost 脚本可以工作,但前提是 pdf 与批处理文件位于同一目录中

echo on
for %%I in ("D:\files\input\" *.pdf) do "C:\Program Files\gs\gs9.20\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="%%~nI_p1.pdf" -dFirstPage=1 -dLastPage=1 "%%I"

我不明白为什么 D:\files\input\ 中的所有目录都没有被循环访问。

您正在执行带有两个参数的命令,"D:\files\input\"*.pdf

您需要查找每个 *.pdf 文件。接受的方式是

for /f "delims=" %%I in ('dir /b /s /a-d "D:\files\input\*.pdf" ') do ...

目录,基本格式,有子目录,但没有目录名。

然而,这将针对每个 *.pdf 执行命令,包括 *_p1.pdfs(即那些已经处理的)所以

for /f "delims=" %%I in ('dir /b /s /a-d "D:\files\input\*.pdf"^|findstr /v /i /e /L "_p1.pdf" ') do ...

将通过查找那些不以 (/v) 以文字 (/L)“_p1.pdf”结尾 (/e) 的名称来排除这些文件,而不考虑大小写 (/i)。但是它会重新生成 _p1s.

for /f "delims=" %%I in ('dir /b /s /a-d "D:\files\input\*.pdf" ') do if not exist "%%~dp*_p1.pdf" ...

将处理那些 *.pdf 尚未处理的。

(未测试)

问题出在你对 for 循环的使用上。参见 for /?
Magoo 更快,请参阅此完整解决方案。

@Echo off
Set "GS=C:\Program Files\gs\gs9.20\bin\gswin64c.exe"
Set "Opt=-dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dFirstPage=1 -dLastPage=1"
Pushd "D:\files\input\"
for /f "delims=" %%I in (
  'Dir /B/S *.pdf ^|find /v "_p1.pdf" '
) do If not exist "%%~dpnI_p1.pdf" "%GS%" %Opt% -sOutputFile="%%~dpnI_p1.pdf" "%%~fI"
Popd