4

首先,我尝试到处寻找,但没有成功。我没有经验,非常感谢任何帮助。我正在尝试编写一个脚本来将一个文件夹拖到一个批处理文件上,然后使用 ImageMagick 将该文件夹中的所有图像转换为 jpg。我可以看到很有可能在命令行上执行脚本,一切正常。但是拖动文件夹给我带来了问题。我可以将许多文件拖到脚本上,它转换得很好:

convert %* %1.jpg

效果很好。我也可以拖动一个文件夹,它会转换里面的图像,但是将其重命名为文件夹的名称,上一级目录,如下所示:

@set SOURCE=%1
convert %SOURCE%\* %SOURCE%.jpg

我想我需要一个 for 循环对文件夹中的每个文件执行转换。但是我遇到了问题。我不确定在哪里加上引号,使用什么变量,以及如何克服空格。我想像这样的事情......

for %%f in (%SOURCE%\*) do ( convert %%f "%SOURCE%\%%f.jpg" )

但是,是的,我不知所措。我正在尝试这个小项目,既可以学习,也可以帮助我父亲快速转换大量照片。

4

2 回答 2

4

听起来 ImageMagick 可以接受多个输入参数和一个输出参数,但要一次使用一个文件来简化它,请尝试以下操作。您的循环看起来正确,但下面的 ~ 更改将处理引号。

您可能还希望将 %%a* 匹配更改为特定文件,这样您就不会捕获现有的 jpg 或非图像文件,例如 (%%a*.png %%a*.gif) 中的 %%f做 ...

最后,在两条转换行前面添加一个“echo”,这样您就可以进行测试运行了。

@echo off

rem Loops through arguments. If a file converts it to a jpg.  If a directory
rem converts files in that directory to jpgs.  Assumes a program "convert".

set count=0
for %%a in (%*) do (
  if exist %%a (
    if exist %%a\ (
      rem Directory, loop through contents
      for %%f in (%%a\*) do (
        convert "%%f" "%%~a\%%~nf.jpg"
        set /a count+=1
      )
    ) else (
      rem File, just convert
      convert "%%~a" "%%~na.jpg"
      set /a count+=1
    )    
  ) else (
    echo Skipping non-existent %%~a
  )
)

echo Converted %count% files

pause
于 2012-06-09T11:44:50.473 回答
1

不是你想要的;这将在原始目录中创建一个新目录,以将修改后的照片保存到:

:: Create the new directory 
md %1\resized 

:: Resize and save the new version
for %%f in (%1\*.jpg) do ( convert "%%f" -thumbnail 800x800 "%1\resized\%%~nf.jpg" )
于 2012-06-09T12:44:05.807 回答