2015-09-04 113 views
1

我想批量調整一大堆使用ImageMagick的圖像文件。我創建了一個Windows批處理文件,其中包含一個命令行參數(包括通配符)。該腳本應爲每個指定的圖像執行convert.exe(我已重命名爲imconvert.exe)。FOR循環中的變量奇怪的輸出

@echo off 
setlocal EnableDelayedExpansion 

set filename=%1 
set file_part=%~nx1 
set folder_part=%~dp1 

if "%filename%" == "" (goto usage) 

REM Create a new folder to put the resized ones in if it doesn't already exist 
set newdir=%folder_part%resized\ 
echo %newdir% 
if not exist %newdir% mkdir %newdir% 

echo. 
echo. 

REM Now convert the files to 640 x 480 
for /f %%f in (%filename%) do (
echo f 
set image_file_name=%%~nxf 
set path_and_filename=%newdir%%image_file_name% 
echo %image_file_name% 
echo %path_and_filename% 
echo imconvert %%f -resize 640x480 -size 640x480 xc:black +swap -gravity center -composite %path_and_filename% 
echo. 
) 

echo. 
echo Images written to %newdir% 
echo. 
goto end 

:usage 
echo. 
echo Usage: imconvert_640x480 folder\filename*.jpg 
echo. 

:end 

當運行此命令:

C:> batchresize.bat d:\ temp目錄* .JPG

我得到以下輸出:

d:\ temp \ 79_DSC_0791.JPG resizedresized resized resize resizedDSC_0491.JPG d:\ temp \ resizedresizedresizedresizedresized resizedizedDSC_0491.JPG imconvert d:\ temp \ 79_D SC_0791.JPG調整大小640×480 640×480 -size XC:黑+交換 - 重心 - 複合d:\ TEMP \ resizedresizedresizedresizedresizedDSC_0491.JP ģ

d:\ TEMP \ DSC_0491.JPG resizedresizedresizedresizedDSC_0491.JPG d :\ TEMP \ resizedresizedresizedresizedresizedDSC_0491.JPG imconvert d:\ TEMP \ DSC_0491.JPG調整大小640×480 640×480 -size XC:黑+交換中心-gravity - 複合:\ TEMP \ resizedresizedresizedresizedresizedDSC_0491.JPG d:\ TEMP \ resizedDSC_0491.JPG

resizedresizedresizedresizedDSC_0491.JPG d:\ TEMP \ resizedresizedresizedresizedresizedDSC_0491.JPG imconvert d:\ TEMP \ resizedDSC_0491.JPG調整大小640×480 640×480 -size XC:黑+交換中心-gravity - 複合d:\ TEMP \ resizedresizedresizedresizedresizedDSC_0491.JPG

爲什麼我在文件名之前得到「resizedresizedresizedresizedized」?此外,爲什麼文件名不會在循環的每次迭代中更新?

+0

http://ss64.com/nt/delayedexpansion.html最有可能 – 2015-09-04 05:11:51

+0

@RC我已經把SETLOCAL EnableDelayedExpansion在頂部。似乎沒有什麼區別... –

回答

2

這裏是重寫,以得到它希望的工作批處理文件:

@echo off 
setlocal EnableDelayedExpansion 

set "filename=%~1" 
set "file_part=%~nx1" 
set "folder_part=%~dp1" 

if "%filename%" == "" goto usage 

REM Create a new folder to put the resized ones in if it doesn't already exist 
set "newdir=%folder_part%resized\" 
echo %newdir% 
if not exist "%newdir%" mkdir "%newdir%" 

echo. 
echo. 

REM Now convert the files to 640 x 480 
for %%I in ("%filename%") do (
    echo %%I 
    set "image_file_name=%%~nxI" 
    set "path_and_filename=%newdir%!image_file_name!" 
    echo !image_file_name! 
    echo !path_and_filename! 
    echo imconvert.exe "%%~fI" -resize 640x480 -size 640x480 xc:black +swap -gravity center -composite "!path_and_filename!" 
    echo. 
) 

echo. 
echo Images written to %newdir% 
echo. 
endlocal 
goto :EOF 

:usage 
echo. 
echo Usage: imconvert_640x480 folder\filename*.jpg 
echo. 
endlocal 

使用雙引號處處圍繞文件名和路徑,使其也工作了與名或路徑1個或多個空格的文件。

延遲擴展需要使用!VariableName!而不是%VariableName%

從參數中刪除參數/F對於,因爲您要處理簡單的文件列表。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • for /?
  • set /?
+0

謝謝!我忘了用感嘆號來包圍循環內的所有變量。有用! –