2015-10-19 121 views
1

我一直在研究这个Windows批处理文件,以减小一个目录(“C:\ BigPDFs”)中所有PDF文件的大小,并将它们移动到不同的目录( “C:\ SmallPDFs”)使用Ghostscript。 Ghostscript的伟大工程,但我遇到的问题是在Windows批处理文件脚本:Windows批处理文件缩小PDF文件大小

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”,“处理页面1到9”,然后最终“处理页面1到4 ”。

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

回答

2

您需要使用延迟扩展。

@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" 
) 
+0

他们都工作。你是男人!非常感谢你。 –