我有多个目录,每个目录中包含一个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 \中的所有目录都没有循环播放。
答案 0 :(得分:1)
您正在使用两个参数"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)结束(/ e)文字(/ L)“_p1.pdf”而不考虑大小写(/ 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
。
(未经测试)
答案 1 :(得分:0)
您对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