Paul Matthews
Paul Matthews

Reputation: 2214

Weird output with variables in FOR loops

I'm trying to batch resize a whole lot of image files using ImageMagick. I've created a Windows batch file which takes a single command line argument (including wildcards). The script should execute convert.exe (I renamed to imconvert.exe) for each image specified.

@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

When I run this command:

C:>batchresize.bat d:\temp*.jpg

I get the following output:

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 - gravity center -composite d:\temp\resizedresizedresizedresizedresizedDSC_0491.JP G

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\resizedresizedresizedresizedresizedDSC_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

Why am I getting "resizedresizedresizedresized" before the filename? Also why is the filename not updating on each iteration of the loop?

Upvotes: 1

Views: 34

Answers (1)

Mofi
Mofi

Reputation: 49086

Here is your batch file rewritten to get it hopefully working:

@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

Use double quotes everywhere around file names and paths to make it work also for files with 1 or more spaces in name or path.

Delayed expansion requires usage of !VariableName! instead of %VariableName%.

And parameter /F is removed from command FOR as you want to process a simple file list.

For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.

  • for /?
  • set /?

Upvotes: 2

Related Questions