2015-10-19 60 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

他們都工作。你是男人!非常感謝你。 –