[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理调用ExifTool批量读取、输出、修改图片IPTC参数的功能

需要对一批jpg格式的图片,根据其【右键】-【属性】-【详细信息】中的【标记】里的内容进行读取,然后输出到文本,每个图片输出一行,每个参数用分号隔开,也要有批量修改图片此参数的功能。
图例如下

我在【第三方命令行】板块的帖子中
http://www.bathome.net/viewthrea ... amp;highlight=jhead
用jhead工具查到这些参数是在【IPTC data】下的【Keywords】显示,参照5楼大佬的代码,可以成功读取到了图片的这个参数,但是没找到修改这个参数的命令。

我提问GPT机器人,给我了两串代码,但是我跑不起来。因为不了解相关的第三方工具,也没有找到详尽的中文教程,所以不知道是哪里的问题,求大佬们指教。多谢!!
第一段
提问:如何使用bat 脚本实现批量修改JPG图片的IPTC参数
回答:要实现批量修改JPG图片的IPTC参数,可以使用exiftool.exe来完成。exiftool.exe是一个命令行工具,可以读取和修改图像的元数据。下面是一个示例脚本,可以批量修改指定文件夹下的所有JPG图片的IPTC参数:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "exiftool_path=C:\path\to\exiftool.exe"
  4. set "image_folder=C:\path\to\image\folder"
  5. for %%f in (%image_folder%\*.jpg) do (
  6.   set "file_path=%%~dpf%%~nf"
  7.   %exiftool_path% ^
  8.     -overwrite_original ^
  9.     -IPTC:ObjectName="New Object Name" ^
  10.     -IPTC:Caption-Abstract="New Caption" ^
  11.     -IPTC:Keywords="Keyword1;Keyword2" ^
  12.     "!file_path!.jpg"
  13. )
复制代码
在上面的脚本中,将exiftool.exe的路径设置为变量“exiftool_path”,将图像文件夹路径设置为变量“image_folder”。使用“for”循环遍历指定文件夹下的所有JPG图片,对于每个图片文件,使用exiftool.exe修改其IPTC参数(这里只修改了ObjectName、Caption-Abstract和Keywords),然后将原始文件覆盖保存。
需要注意的是,exiftool.exe的参数名是区分大小写的,不要将参数名写错。另外,这里使用了“setlocal enabledelayedexpansion”来启用延迟扩展变量,否则在循环中使用“!file_path!”时会出现问题。(1/10)


第二段:
提问: 如何使用bat脚本实现批量读取图片的IPTC参数并输出到文本,然后通过文本批量修改图片的IPTC参数
回答:这是一个基本的bat脚本的框架,用于读取图片的IPTC参数并将其输出到文本。前提是需要安装ExifTool并在系统环境变量中设置其路径。
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set "folder=C:\path\to\folder\with\images"
  4. set "outfile=C:\path\to\output\file.txt"
  5. echo "File, Creator, Title, Description" > %outfile%
  6. for %%f in (%folder%\*.jpg) do (
  7.     set "filename=%%~nxf"
  8.     set "creator="
  9.     set "title="
  10.     set "description="
  11.     for /f "tokens=1,2 delims=:" %%a in ('exiftool -s3 -iptc:Creator -iptc:ObjectName -iptc:Caption-Abstract "%%~f"') do (
  12.         if "%%a"=="Creator" set "creator=%%b"
  13.         if "%%a"=="ObjectName" set "title=%%b"
  14.         if "%%a"=="Caption-Abstract" set "description=%%b"
  15.     )
  16.     echo "!filename!,!creator!,!title!,!description!" >> %outfile%
  17. )
  18. echo "Done."
  19. pause
复制代码
这个脚本会将指定文件夹中的所有`.jpg`文件的IPTC参数读取到一个文本文件中。你可以使用文本编辑器或Excel等工具将其打开和编辑。在这个基础之上,你可以编写另一个bat脚本,以读取此文件并使用ExifTool将修改后的IPTC参数应用于相应的图片。(1/10)

图片没附成功,我把两个示例图链接放这里,辛苦大佬们看一下
https://gd-hbimg.huaban.com/7fbf335f50d9916a0c982ccef6766b27452d74264788-MjW35x_fw1200webp
https://gd-hbimg.huaban.com/3669afb81fae4c6e5070902061730972fcb57fe867d3-Hfq7YD_fw1200webp

TOP

  1. rem 另存为 ANSI 编码
  2. ' & cls & cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit
  3. Dim oWshShell, oFSO, s, oShell
  4. Const file = "1.jpg"    '原文件。支持文件拖放,支持文件名作为命令行参数
  5. Set oShell = CreateObject("Shell.Application")
  6. Set oWshShell = CreateObject("WScript.Shell")
  7. Set oFSO = CreateObject("Scripting.FileSystemObject")
  8. s = oFSO.GetParentFolderName(WScript.ScriptFullname)
  9. oWshShell.CurrentDirectory = s
  10. If WScript.Arguments.Count > 0 Then
  11.     For Each s In WScript.Arguments
  12.         Call run(s)
  13.     Next
  14. Else
  15.     Call run(file)
  16. End If
  17. Sub run(ByVal file)
  18.     Dim s, oFolder, oFolderItem, i
  19.     s = oFSO.GetAbsolutePathName(file)
  20.     WScript.Echo s
  21.     Set oFolder = oShell.NameSpace(oFSO.GetParentFolderName(s))
  22.     Set oFolderItem = oFolder.ParseName(oFSO.GetFileName(s))
  23.     For i = 0 To 500
  24.         If oFolder.GetDetailsOf(Null, i) = "标记" Then s = i
  25.     Next
  26.     s = oFolder.GetDetailsOf(oFolderItem, s)
  27.     If InStr(s, ";") Then
  28.         For Each i In Split(s, ";")
  29.             WScript.Echo "标记" & vbTab & Trim(i)
  30.         Next
  31.     Else
  32.         WScript.Echo "标记" & vbTab & s
  33.     End If
  34. End Sub
复制代码
读取标记

QQ 20147578

TOP

回复 3# czjt1234


    请教大佬,这个是vbs代码么,看着不太像bat,保存文本后缀需要改成vbs么还是其它后缀,请原谅我太菜

TOP

保存为bat

没看清题目,只能读取不能修改

QQ 20147578

TOP

回复 5# czjt1234


    大佬,我运行了不显示标记的具体内容(截图如链接),如果能正常显示,那输出到文档应该不成问题。另外,修改这个参数的功能可以实现么?
https://gd-hbimg.huaban.com/e0c5ae379accee1cb51c11a332c299eccdeabc522800-ltFmVV_fw1200webp

TOP

回复 6# 52hz


    我在win7x64测试正确的

你是啥系统?

QQ 20147578

TOP

回复 7# czjt1234


    win 7 专业版,64位

TOP

本帖最后由 77七 于 2023-9-22 17:20 编辑

读取
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  4. for /f "tokens=1* delims=:" %%a in ('exiftool "%%i" ^|find "Keywords"') do (
  5. set "str=%%b"
  6. set "str=!str:,=;!"
  7. set "str=!str: =!"
  8. echo %%~fi !str!
  9. )
  10. ))>1.txt
  11. endlocal
  12. pause
复制代码


修改
  1. @echo off
  2. rem 如 str=参数1, 参数2
  3. set /p str=输入参数:
  4. for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  5. exiftool -overwrite_original -iptc:Keywords="%str%" "%%i"
  6. )
  7. pause
复制代码
1

评分人数

bat小白,请多指教!谢谢!

TOP

回复 9# 77七


    测试了一下读取和写入都很好用,太感谢了,多谢大佬,谢谢!!

TOP

回复 2# 52hz


如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 11# Batcher


    好的,多谢大佬

TOP

本帖最后由 52hz 于 2023-5-18 08:26 编辑

回复 9# 77七


    大佬,在使用过程中发现一个问题,当输入参数过长的时候会提示:
    Waring:【Minor】IPTC:Keywords exceeds length limit  <truncated> - 图片名称.jpg
    运行窗口截图:https://imgse.com/i/p9Wvq61
    我翻译了一下,说是超过长度限制,被截断。修改后的图片标记只截取了输入参数的前60个字符。
    请问这个有解决办法么,或者有没有其它不限制长度的命令行工具可以代替?

TOP

  1. chcp 65001
  2. rem 查看
  3. exiftool -s -m -FileName -iptc:keywords -T *.jpg
  4. rem 修改
  5. exiftool -m -overwrite_original -iptc:keywords="values1,value2" *.jpg
  6. rem exif与iptc属性都是unicode,请将脚本保存为utf-8编码
复制代码
1

评分人数

TOP

回复 13# 52hz

chatgpt答案,这个可以设置超60个字符,替换一下修改那一行就行
  
  1. Exiv2是一款开源的图像元数据编辑器,可以修改图片的IPTC信息,包括Keywords关键词。下面是修改图片IPTC:Keywords参数的示例:
  2. 假设我们要修改一张名为"example.jpg"的图片的Keywords参数为"landscape, nature, mountain",则需要使用以下命令:
  3. exiv2 -M "set Iptc.Application2.Keywords landscape nature mountain" example.jpg
  4. 其中,-M指定对元数据进行操作,"set Iptc.Application2.Keywords"表示设置IPTC的Keywords参数,后面跟着要设置的关键词,多个关键词之间用空格隔开。最后是要修改的图片文件名。
  5. 执行以上命令后,应该会看到如下输出:
  6. setting Iptc.Application2.Keywords to landscape, nature, mountain
  7. 这说明Keywords参数已经成功被修改了。
复制代码
bat小白,请多指教!谢谢!

TOP

返回列表