批处理脚本拖放文件夹使用ImageMagick转换图像

4

首先,我已经尝试过到处查找,但没有成功。由于我缺乏经验,所以非常感激任何形式的帮助。我正在尝试编写一个脚本,将文件夹拖放到批处理文件上,并使用ImageMagick将该文件夹中的所有图像转换为jpg格式。我看到在命令行上执行脚本是非常可行的,一切都很顺利。但是将文件夹拖放到脚本上却让我遇到了一些问题。我可以将许多文件拖放到脚本上,然后进行转换:

convert %* %1.jpg

这个功能很好用。我还可以拖动一个文件夹,它会将里面的图片转换,并重命名为文件夹名称,比原来高一级目录,如下:

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

我想我需要一个for循环来对文件夹中的每个文件进行转换。但是我遇到了一些问题。我不确定在哪里放引号,应该使用什么变量,以及如何处理空格。我想象一下像这样...
for %%f in (%SOURCE%\*) do ( convert %%f "%SOURCE%\%%f.jpg" )

但是,我很茫然。我正在尝试这个小项目,既是为了学习,也是为了帮助我的父亲快速转换大量的照片。


哦不!有人用递归回答了,现在它消失了 :( 有人知道如何修改罗德尼的脚本添加递归吗?如果我在错误的地方问了这个问题,请原谅。我知道它是用/R开关,但是无法完全实现... - Luke
2个回答

4
似乎ImageMagick可以使用多个输入参数和一个输出参数,但为了每次只处理一个文件,您可以尝试以下操作。您的循环看起来没问题,但是下面的~更改将处理引号。
您可能还想将%%a*匹配更改为特定文件,以便不捕获现有的jpg或非图像文件,例如:对于%%f in (%%a*.png %%a*.gif) do ...
最后,在两个转换行之前添加“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

那太好了 Rodney。我真的很感激你在脚本中提供的意见,这有助于我理解。感谢你抽出时间来帮忙。 - Luke
也许可以使用PowerShell脚本。 - Kiquenet

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" )

我没有仔细阅读你的问题,我的代码只能读取jpg图像并在保存之前调整它们的大小。 - Bonzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接