2015-09-04 111 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

谢谢!我忘了用感叹号来包围循环内的所有变量。有用! –