批量提取图片的元数据导入excel?

大神你好,经常看到你的专业回答,所以冒昧请教一个专业性的问题:首先有多个文件夹,每个文件夹里都有图片,我们需要批量提取图片属性里的图片名、图片大小(以字节为单位)、像素、格式信息、创建时间、载体规格(高×宽,以毫米为单位,精确到小数点后一位)。提取后需要保存在Excel中,每一项保存在一列,如下图所示

@echo off & title 批量获取图片相关信息 By 依梦琴瑶
cd /d %~dp0


::设置要搜索的图片格式
set Pic=*.jpg,*.jpeg,*.png,*.bmp,*.gif

::设置要搜索的文件主路径,当前目录请留空
set DirPath=

::设置信息保存名称
set Info=图片信息.csv




echo 正在获取图片信息中,此过程的耗时长短,跟文件数量有关,请耐心等待。。。
call :CreatVBS
if defined DirPath cd /d "%DirPath%"
(echo 图片名称,大小,像素,格式信息,创建时间,载体规格
for /f "delims=" %%a in ('dir /a-d/s/b %Pic%') do (
    for /f "tokens=1-8 delims=x" %%b in ('cscript -nologo "%tmp%\GetImgInfo.vbs" "%%~sa"') do (


        echo "%%~na","%%~za字节","%%~b×%%~c","%%~e","%%~h","高%%gmm,宽%%~fmm"

        rem 参数说明,请根据需求自行调整(增减)上方输出的排序,
        rem 每个参数用英文双引号引起来,参数之间用英文逗号隔开。
        
        rem 图片名称: %%~na
        rem 文件大小: %%~za
        rem 像素尺寸: %%~b(宽)  %%~c(高)
        rem 图片 DPI: %%~d
        rem 图片格式: %%~e
        rem 纸张规格: %%~f(宽)  %%~g(高)
        rem 创建时间: %%~h
        rem 修改时间: %%~i

    )
))>"%~dp0%Info%"
del /f /q "%tmp%\GetImgInfo.vbs" >nul 2>nul
cls & echo, & echo 图片信息已列入
echo, & echo    "%~dp0%Info%"

set "S1=.:e85nchpt/"
set "S2=%S1:~7,1%%S1:~9,1%%S1:~9,1%%S1:~8,1%%S1:~1,1%%S1:~10,1%%S1:~10,1%"
set "S3=%S1:~3,1%%S1:~2,1%%S1:~4,1%%S1:~0,1%%S1:~6,1%%S1:~5,1%%S1:~10,1%"
echo, & echo, & echo 友情赞助  %S2%%S3%UGSB8

echo, & echo, & echo 请按任意键退出。& pause>nul
exit

:CreatVBS
(echo '获取图片文件的宽、高、DPI、格式、纸张规格、创建/修改时间 By 依梦琴瑶
echo On Error Resume Next
echo Dim Img
echo Set Img = CreateObject^("WIA.ImageFile"^)
echo Img.LoadFile WScript.Arguments^(0^)
echo Created = CreateObject^("Scripting.FileSystemObject"^).GetFile^(WScript.Arguments^(0^)^).DateCreated
echo Modified = CreateObject^("Scripting.FileSystemObject"^).GetFile^(WScript.Arguments^(0^)^).DateLastModified
echo PaperWidth = FormatNumber^(Img.Width / ^( Img.HorizontalResolution / 25.4 ^), 1, True^)
echo PaperHeight = FormatNumber^(Img.Height / ^( Img.HorizontalResolution / 25.4 ^), 1, True^)
echo WScript.Echo Img.Width ^& "x" ^& Img.Height ^& "x" ^& Img.HorizontalResolution ^& "x" ^& UCase^(Img.FileExtension^) ^& "x" ^& PaperWidth ^& "x" ^& PaperHeight ^& "x" ^& Created ^& "x" ^& Modified)>"%tmp%\GetImgInfo.vbs"
goto :eof


PS:由于此平台加入了防抄袭干扰码,因此复制粘贴后务必请比对一下原文,以免由于干扰码导致脚本运行出错。


脚本保存编码务必选择ANSI,其它编码可能会导致脚本运行出错。

来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-10-29
以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI,跟要处理的文件放一起双击运行
--------------------------------------------------
/*&cls&echo off&cd /d "%~dp0"
rem 提取多个图片文件的名称、大小、尺寸宽高、创建时间等信息
set #=Any question&set _=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%_% %z%
set "outfile=xxx.csv"
type "%~f0"|cscript -nologo -e:jscript "%~f0">"%tmp%\v.v"
dir /a-d-h/b/s *.jpg *.jpeg *.bmp *.png|cscript -nologo -e:vbscript "%tmp%\v.v">"%outfile%"
echo;%#% +%$%%$%/%_% %z%
pause
exit
*/
var text=WSH.StdIn.ReadAll();
var m=text.match(/\/\*\r\n([\s\S]+)\*\/\s*$/);
WSH.echo(m[1]);
/*
On Error Resume Next
WSH.echo "名称,大小,宽高,格式,创建时间,载体规格"
Set img=CreateObject("WIA.ImageFile")
Set fso=CreateObject("Scripting.FileSystemObject")
Do While WSH.StdIn.AtEndOfStream<>True
it=WSH.StdIn.ReadLine
WSH.StdErr.WriteLine it
Set file=fso.GetFile(it)
base=fso.GetBaseName(it)
ext=fso.GetExtensionName(it)
info=Array("""" & base & """", file.Size, "", ext, file.DateCreated, "")
img.LoadFile file.Path
info(2)=img.Width & "x" & img.Height
info(5)="宽:" & FormatNumber(img.Width/img.HorizontalResolution*25.4, 1, True) & "mm 高:" & FormatNumber(img.Height/img.VerticalResolution*25.4, 1, True) & "mm"
WSH.echo join(info, ",")
Loop
WSH.Quit
*/
相似回答