Windows批处理文件以减少PDF文件大小

时间:2015-10-19 20:09:24

标签: windows batch-file pdf cmd ghostscript

我一直在处理这个Windows批处理文件,以减少一个目录中的所有PDF文件的大小(" C:\ BigPDFs")并将它们移动到另一个目录(& #34; C:\ SmallPDFs")使用Ghostscript。 Ghostscript效果很好,但我遇到的问题是在Windows批处理文件脚本中:

for /R "%1" %%f in (*.pdf) do (
    SET outfile=%2\%%~nf%%~xf   
    gswin32c.exe -sDEVICE=pdfwrite -dMaxSubsetPct=100 -dPDFSETTINGS=/ebook -sOutputFile=%outfile% -dNOPAUSE -dBATCH "%%f"   
)

" C:\ BigPDFs"目录中有四个文件:

  • TEST1.pdf(5页)
  • TEST2.pdf(9页)
  • TEST3.pdf(9页)
  • TEST4.pdf(4页)

我希望它能将相同的四个压缩文件写入" C:\ SmallPDFs"目录,但唯一写的是" TEST4.pdf"。看来%outfile%变量总是解析为" C:\ BigPDFs"中的最后一个文件名。目录(" TEST4.pdf"),即使它按顺序处理所有四个文件。我知道它处理所有四个文件的原因是因为Ghostscript输出显示"处理页面1到5",然后是"处理页面1到9",&#34 ;处理第1页到第9页和第34页,最后是#34;处理第1页到第4页和第34页;

为什么变量总是解析为最后一个文件(" TEST4.pdf")?有没有办法捕捉"当前"它处理并将其存储在变量中的文件名,以便它保留"当前"运行Ghostscript时的文件名?

1 个答案:

答案 0 :(得分:3)

您需要使用延迟扩展。

@echo off
setlocal enabledelayedexpansion
for /R "%1" %%f in (*.pdf) do (
    SET outfile=%2\%%~nf%%~xf   
    gswin32c.exe -sDEVICE=pdfwrite -dMaxSubsetPct=100 -dPDFSETTINGS=/ebook -sOutputFile=!outfile! -dNOPAUSE -dBATCH "%%f"   
)

但我想你也可以这样做。

for /R "%1" %%f in (*.pdf) do (  
    gswin32c.exe -sDEVICE=pdfwrite -dMaxSubsetPct=100 -dPDFSETTINGS=/ebook -sOutputFile="%~2\%%~nxf" -dNOPAUSE -dBATCH "%%f"   
)