Windows 在FOR循环中包含变量的奇怪输出

Windows 在FOR循环中包含变量的奇怪输出,windows,batch-file,Windows,Batch File,我正在尝试使用ImageMagick批量调整大量图像文件的大小。我已经创建了一个Windows批处理文件,它只接受一个命令行参数(包括通配符)。脚本应该为每个指定的图像执行convert.exe(我重命名为imconvert.exe) @echo off setlocal EnableDelayedExpansion set filename=%1 set file_part=%~nx1 set folder_part=%~dp1 if "%filename%" == "" (goto us

我正在尝试使用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\u DSC\u 0791.JPG ResizedResizedResizedResizedResc_0491.JPG d:\temp\resizedresizedresizedresizeddsc\u 0491.JPG imconvert d:\temp\79\u DSC\u 0791.JPG-调整大小640x480-大小640x480 xc:黑色+交换- 重心-组合d:\temp\resizedResizedResizedResizedResizedDdsc_0491.JP G

d:\temp\DSC\u 0491.JPG ResizedResizedResizedResizedResc_0491.JPG d:\temp\resizedresizedresizedresizeddsc\u 0491.JPG imconvert d:\temp\DSC\u 0491.JPG-调整尺寸640x480-尺寸640x480 xc:black+交换-重心-复合:\temp\resizedResizedResizedResizedDdsc\u 0491.JPG d:\temp\resizedDSC_0491.JPG

ResizedResizedResizedResizedResc_0491.JPG d:\temp\resizedresizedresizedresizeddsc\u 0491.JPG imconvert d:\temp\resizedDSC_0491.JPG-resize 640x480-size 640x480 xc:black+swap-重心-复合d:\temp\resizedresizedresizedresizedresizedDSC_0491.JPG


为什么在文件名之前会出现“ResizedResizedResizedResizedResizedResizedResizedResized”?还有,为什么文件名在循环的每次迭代中都不更新

这是您的批处理文件,您可以将其重写以使其正常工作:

@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%

当您想要处理一个简单的文件列表时,参数
/F
将从命令中删除

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 获取/?
  • 设置/?

大多数likely@RC我已将setlocal EnableDelayedExpansion放在顶部。似乎没什么区别…谢谢!我忘了用感叹号将循环中的所有变量括起来。它起作用了!