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" 目录中有四个文件:
- TEST1.pdf(5 页)
- TEST2.pdf(9 页)
- TEST3.pdf(9 页)
- TEST4.pdf(4 页)
我希望它将相同的四个压缩文件写入 "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"
)
我一直在处理这个 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" 目录中有四个文件:
- TEST1.pdf(5 页)
- TEST2.pdf(9 页)
- TEST3.pdf(9 页)
- TEST4.pdf(4 页)
我希望它将相同的四个压缩文件写入 "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"
)