遍历目录以从多个 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.pdf
s(即那些已经处理的)所以
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)。但是它会重新生成 _p1
s.
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
我有多个目录,每个目录包含一个 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.pdf
s(即那些已经处理的)所以
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)。但是它会重新生成 _p1
s.
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