Windows 用于减小 PDF 文件大小的批处理文件

Windows Batch File to Reduce PDF File Size

我一直在处理这个 Windows 批处理文件,以减小一个目录 ("C:\BigPDFs") 中所有 PDF 文件的大小,并将它们移动到另一个目录 ("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" 目录中有四个文件:

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

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

您需要使用延迟扩展。

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