我正在尝试使用ImageMagick批量调整大量图像文件。我创建了一个Windows批处理文件,它接受一个命令行参数(包括通配符)。该脚本应为每个指定的映像执行convert.exe(我重命名为imconvert.exe)。
@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 resizedresizedresizedresizedDSC_0491.JPG d:\ TEMP \ resizedresizedresizedresizedresizedDSC_0491.JPG imconvert d:\ temp \ 79_DSC_0791.JPG -resize 640x480 -size 640x480 xc:black + swap - 重心 - 复合d:\ temp \ resizedresizedresizedresizedresizedDSC_0491.JP ģ
d:\ TEMP \ DSC_0491.JPG resizedresizedresizedresizedDSC_0491.JPG d:\ TEMP \ resizedresizedresizedresizedresizedDSC_0491.JPG imconvert d:\ temp \ DSC_0491.JPG -resize 640x480 -size 640x480 xc:black + swap -gravity center -composite:\ temp \ resizedresizedresizedresizedresizedresizedDSC_0491.JPG d:\ TEMP \ resizedDSC_0491.JPG
resizedresizedresizedresizedDSC_0491.JPG d:\ TEMP \ resizedresizedresizedresizedresizedDSC_0491.JPG imconvert d:\ temp \ resizedDSC_0491.JPG -resize 640x480 -size 640x480 xc:black + swap -gravity center -composite d:\ temp \ resizedresizedresizedresizedresizedDSC_0491.JPG
为什么我在文件名之前得到“resizedresizedresizedresized”?另外,为什么文件名不会在循环的每次迭代中更新?
答案 0 :(得分: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 中删除,因为您要处理简单文件列表。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
for /?
set /?