Board logo

标题: [文件操作] [分享]批处理获取图片文件拍摄时间的几个方法 [打印本页]

作者: aloha20200628    时间: 2024-9-20 15:10     标题: [分享]批处理获取图片文件拍摄时间的几个方法


基本目的是》不用下载预装第三方,只用系统内置的资源,在批处脚本中直接调用 findstr/jscript/powershell 获取图片文件内置的 ‘拍摄时间’ (与资源管理器显示的图片文件拍摄时间一致),为此参考了老帖中的一些有效方法,梳理精装了测试代码分享如下,均予测试通过

方法一》直接用 findstr 匹配图片文件中内置的 ‘拍摄时间’ 字段,取用最后一个匹配结果
  1. @echo off &set/p "pF=拖入一个图片文件(查看其拍摄时间):"
  2. for /f "delims=" %%t in (
  3. 'findstr "199 200 201 202" %pF%^|more^|findstr /rc:"[12][09][0-9][0-9]:[0-9][0-9]:[0-9][0-9]" '
  4. ) do set "t=%%t"
  5. echo,%t%&pause&exit/b
复制代码
方法二》通过 powershell 调用 wia.imageFile (微软标定的一种 ‘图像信息获取接口’) 提取与 ‘拍摄时间’ 对应的属性数据
  1. @echo off &set/p "pF=拖入一个图片文件(查看其拍摄时间):"
  2. for /f "delims=" %%t in (
  3. 'powershell "$i=new-object -comobject WIA.ImageFile;$i.LoadFile('%pF%');$i.properties.item('ExifDTOrig').value" '
  4. ) do echo,%%t
  5. pause&exit/b
复制代码
方法三:代码存为 test.bat 运行》通过 jscript 调用 wia.imageFile 提取与 ‘拍摄时间’ 对应的属性数据
  1. @set @v=1 /* &@echo off &set/p "pF=拖入一个图片文件(查看其拍摄时间):"
  2. for /f "delims=" %%t in ('cscript /nologo /e:jscript "%~f0" %pF%') do echo,%%t
  3. pause&exit/b */
  4. v=WSH.arguments, img=WSH.createObject('WIA.imageFile'), img.loadFile(v(0));
  5. WSH.echo(img.properties.item('ExifDTOrig').value);
  6. WSH.quit();
复制代码
方法四:代码存为 test.bat 运行》通过 jscript 调用 shell.appliction 提取与 ‘拍摄时间’ 对应的属性数据
  1. @set @v=1 /* &@echo off &setlocal&set/p "pF=拖入一个图片文件(查看其拍摄时间):"
  2. for /f "delims=" %%t in ('cscript /nologo /e:jscript "%~f0" %pF%') do set "t=%%t"
  3. echo,%t:?=% &endlocal&pause&exit/b */
  4. v=WSH.arguments, s=WSH.createobject('shell.application');
  5. n=v(0).lastIndexOf('\\'), p=v(0).slice(0,n), f=v(0).slice(n+1);
  6. d=s.NameSpace(p), i=d.ParseName(f);
  7. WSH.echo(d.GetDetailsOf(i, 12)); //属性序号=12 对应属性名='dateTaken'
  8. WSH.quit()
复制代码

作者: buyiyang    时间: 2024-9-20 19:09

本帖最后由 buyiyang 于 2024-9-20 19:32 编辑

也可以直接读取图片文件的exif信息,
从9003标签的DE数据获取拍摄时间信息的偏移量,
根据文件头判断大小端序,然后解码出拍摄时间,简单写了一下
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a size=2048
  3. for %%i in (*.jpg *.jpeg *.tiff *.raw *.cr2 *.cr3) do (
  4.     copy /y "%%i" $.temp >nul
  5.     fsutil file seteof $.temp %size% >nul
  6.     certutil -encodehex -f $.temp $.temp >nul
  7.     set /a n=tag=len=end=t=dt=le=0&set "offset="
  8.     (for /f "tokens=1*" %%a in ($.temp) do (
  9.         set "str=%%b"
  10.         for /f "delims=。" %%s in ("!str:   =。!") do for %%h in (%%s) do (
  11.             if !end! lss 19 (
  12.                 set /a n+=1,tag+=1
  13.                 if /i "%%h"=="2a" if "!pre!"=="49" if "!ppre!"=="49" set /a n=3
  14.                 if /i "%%h"=="00" if "!pre!"=="4d" if "!ppre!"=="4d" set /a n=3,le=1
  15.                 if !le! equ 1 (
  16.                     if "!pre!%%h"=="9003" set /a 1/t 2>nul||set /a tag=1009003,t+=1
  17.                     ) else if "%%h!pre!"=="9003" set /a 1/t 2>nul||set /a tag=1009003,t+=1
  18.                 if !tag! gtr 1009009 if !tag! leq 1009013 (
  19.                     if !le! equ 1 (set "offset=!offset!%%h") else set "offset=%%h!offset!"
  20.                     set /a len+=1
  21.                     )
  22.                 if !len! equ 4 if !n! gtr 0x!offset! echo,%%h&set /a end+=1
  23.                 set "pre=%%h"&&set "ppre=!pre!"
  24.                 )
  25.             )
  26.         ))> $.time
  27.     certutil -decodehex -f $.time $.time >nul
  28.     for /f "tokens=* delims=" %%t in ($.time) do set dt=%%t
  29.     if !dt! equ 0 (echo,------nothing---------%%i) else echo,!dt!---%%i
  30.     )
  31. del /q $.temp $.time
  32. pause
复制代码

作者: Five66    时间: 2024-9-21 13:59

貌似标签号 0x0132(DateTime) 和 0x9003(DateTimeOriginal/ExifDTOrig) 是一样的
作者: aloha20200628    时间: 2024-9-21 14:43

本帖最后由 aloha20200628 于 2024-9-21 14:46 编辑

回复 3# Five66

参见》https://photo.stackexchange.com/ ... -in-what-circumstan





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2