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

[文件操作] 求助BAT脚本给文件名添加创建时间

1.网上找了一段代码修改,运行错误,求指正。
2.下面代码添加的是修改时间,如果是创建时间,代码又如何写?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set count=1
  4. for /f "delims=" %%a in ('dir /b /a-d/tc' ) do (
  5. set "name=%%a"
  6. set "ext=%%~xa"
  7. set "datestring=%%~ta"
  8. echo !datestring!
  9. set "year=!datestring:~0,4!"
  10. set "month=!datestring:~5,2!"
  11. set "day=!datestring:~8,2!"
  12. set "hour=!datestring:~11,2!"
  13. set "minute=!datestring:~14,2!"
  14. :: %%~ta提取的时间格式为2024-07-17 13:50不包含秒
  15. set "second=!datestring:~17,2!"
  16. set "newname=!year!!month!!day!_!hour!!minute!!second!"
  17. echo !ext!
  18. echo !datestring!
  19. if not "!name!"=="!newname!"(
  20. if exist "!newname!"(
  21. set "newname=!year!!month!!day!_!hour!!minute!!second!_!count!!ext!"
  22. set /a count+=1
  23. )
  24. ren !name! "!newname!"
  25. )
  26. )
  27. endlocal
  28. pause
复制代码

本帖最后由 ppll2030 于 2024-7-17 23:26 编辑

回复 1# meiszp


    你的主要代码就是显示创建日期。不过下面又重新提取了创建时间,乱啊。看不懂去了。
其实 dir /tc 就是显示创建日期的,只要用for来提取一下重命名即可。
注意:如果你觉得日期不对。请检查文件是否通过复制的来,还是从压缩包解压出来的?
后者的创建日期因解压会被更新为解压时的日期。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 同级目录下,所有文件的名称都添加创建日期,不含文件夹
  4. for /f "tokens=1-3* delims= " %%f in ('dir /a-d /tc ^| findstr /rc:"[0-9][0-9]:[0-9][0-9]"') do (
  5. set t=%%f&set t=!t:/=-!&set m=%%g&set m=!m::=!
  6. rem 请确认无误,再删除 echo 即为执行更名添加创建日期
  7. echo if "%%~i" neq "%~nx0" ren "%%i" "%%~ni【!t!_!m!】%%~xi"
  8. )
  9. pause
复制代码

TOP

回复 2# ppll2030
文件名后面日期和时间都需要。

TOP

本帖最后由 ppll2030 于 2024-7-17 23:28 编辑

回复 3# meiszp


    突然想起一个bug。添加的时间不能直接用。所以直接去掉了其中的英文冒号“:”

TOP

回复 1# meiszp
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "%~dp0"
  4. set "count=1"
  5. for /f "tokens=1-3*" %%a in ('dir /a-d /tc ^| findstr /b "[0-9]"' ) do (
  6.     set "OldName=%%d"
  7.     set "ext=%%~xd"
  8.     set "DateString=%%a %%b"
  9.     set "year=!DateString:~0,4!"
  10.     set "month=!DateString:~5,2!"
  11.     set "day=!DateString:~8,2!"
  12.     set "hour=!DateString:~11,2!"
  13.     set "minute=!DateString:~14,2!"
  14.     set "NewName=!year!!month!!day!_!hour!!minute!%%~d"
  15.     if not "!OldName!" == "%0" (
  16.         if not "!OldName!" == "!NewName!!ext!" (
  17.             if exist "!NewName!" (
  18.                 set "NewName=!year!!month!!day!_!hour!!minute!_!count!!ext!"
  19.                 set /a count+=1
  20.             )
  21.             echo "!OldName!" ---^> "!NewName!"
  22.             ren "!OldName!" "!NewName!"
  23.         )
  24.     )
  25. )
  26. pause
复制代码
测试代码之前请做好备份

TOP

本帖最后由 aloha20200628 于 2024-7-18 16:02 编辑


仅用 dir /tc 拿不到秒级文件创建时间,用%%~tF获取的也只是秒级的文件修改时间,所以批处要拿到秒级的文件创建时间,须借助wmic/jscript/vbs/powershell等外部方法。以下代码调用wmic配合for循环逐个获取秒级文件创建时间可谓 ‘良配’,若改用jscript/vbs/powershel等脚本获取就不如干脆一把包圆了...
代码对遭遇重名的处理对策是反复调用子过程 :checkF 直至适配出一个不重名的新文件名为止
  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /b/a-d') do (
  3. set "F=%%~fa" &set "F=!F:\=\\!"
  4. for /f "tokens=2 delims=.=" %%b in (
  5. ' wmic datafile where "name='!F!'" get creationdate /value^|find /v "" ') do (
  6. set "nF=%%b"&set "nF=!nF:~0,8!_!nF:~8!"&set "xF=%%~xa"&set "n="
  7. if exist "!nF!%%~xa" (call :checkF)
  8. ren "%%~fa" "!nF!%%~xa"
  9. )
  10. )
  11. endlocal&pause&exit/b
  12. :checkF
  13. set/a "n+=1" &if exist "!nF!_!n!!xF!" goto :checkF
  14. set "nF=!nF!_!n!"&exit/b
复制代码

TOP

回复 5# ShowCode
那修改时间应该怎么写

TOP

回复 7# jzmaker


   在论坛内搜索下,看看能不能找到同样的问题贴。
bat小白,请多指教!谢谢!

TOP

返回列表