标题: [文件操作] 求助BAT脚本给文件名添加创建时间 [打印本页]
作者: meiszp 时间: 2024-7-17 14:14 标题: 求助BAT脚本给文件名添加创建时间
1.网上找了一段代码修改,运行错误,求指正。
2.下面代码添加的是修改时间,如果是创建时间,代码又如何写?- @echo off
- setlocal enabledelayedexpansion
-
- set count=1
- for /f "delims=" %%a in ('dir /b /a-d/tc' ) do (
- set "name=%%a"
- set "ext=%%~xa"
- set "datestring=%%~ta"
- echo !datestring!
- set "year=!datestring:~0,4!"
- set "month=!datestring:~5,2!"
- set "day=!datestring:~8,2!"
- set "hour=!datestring:~11,2!"
- set "minute=!datestring:~14,2!"
- :: %%~ta提取的时间格式为2024-07-17 13:50不包含秒
- set "second=!datestring:~17,2!"
- set "newname=!year!!month!!day!_!hour!!minute!!second!"
- echo !ext!
- echo !datestring!
- if not "!name!"=="!newname!"(
- if exist "!newname!"(
- set "newname=!year!!month!!day!_!hour!!minute!!second!_!count!!ext!"
- set /a count+=1
- )
- ren !name! "!newname!"
- )
- )
- endlocal
- pause
复制代码
作者: ppll2030 时间: 2024-7-17 15:22
本帖最后由 ppll2030 于 2024-7-17 23:26 编辑
回复 1# meiszp
你的主要代码就是显示创建日期。不过下面又重新提取了创建时间,乱啊。看不懂去了。
其实 dir /tc 就是显示创建日期的,只要用for来提取一下重命名即可。
注意:如果你觉得日期不对。请检查文件是否通过复制的来,还是从压缩包解压出来的?
后者的创建日期因解压会被更新为解压时的日期。- @echo off
- setlocal enabledelayedexpansion
- rem 同级目录下,所有文件的名称都添加创建日期,不含文件夹
- for /f "tokens=1-3* delims= " %%f in ('dir /a-d /tc ^| findstr /rc:"[0-9][0-9]:[0-9][0-9]"') do (
- set t=%%f&set t=!t:/=-!&set m=%%g&set m=!m::=!
- rem 请确认无误,再删除 echo 即为执行更名添加创建日期
- echo if "%%~i" neq "%~nx0" ren "%%i" "%%~ni【!t!_!m!】%%~xi"
- )
- pause
复制代码
作者: meiszp 时间: 2024-7-17 15:32
回复 2# ppll2030
文件名后面日期和时间都需要。
作者: ppll2030 时间: 2024-7-17 15:35
本帖最后由 ppll2030 于 2024-7-17 23:28 编辑
回复 3# meiszp
突然想起一个bug。添加的时间不能直接用。所以直接去掉了其中的英文冒号“:”
作者: ShowCode 时间: 2024-7-17 22:27
回复 1# meiszp - @echo off
- setlocal enabledelayedexpansion
- cd /d "%~dp0"
- set "count=1"
- for /f "tokens=1-3*" %%a in ('dir /a-d /tc ^| findstr /b "[0-9]"' ) do (
- set "OldName=%%d"
- set "ext=%%~xd"
- set "DateString=%%a %%b"
- set "year=!DateString:~0,4!"
- set "month=!DateString:~5,2!"
- set "day=!DateString:~8,2!"
- set "hour=!DateString:~11,2!"
- set "minute=!DateString:~14,2!"
- set "NewName=!year!!month!!day!_!hour!!minute!%%~d"
- if not "!OldName!" == "%0" (
- if not "!OldName!" == "!NewName!!ext!" (
- if exist "!NewName!" (
- set "NewName=!year!!month!!day!_!hour!!minute!_!count!!ext!"
- set /a count+=1
- )
- echo "!OldName!" ---^> "!NewName!"
- ren "!OldName!" "!NewName!"
- )
- )
- )
- pause
复制代码
作者: aloha20200628 时间: 2024-7-18 15:47
本帖最后由 aloha20200628 于 2024-7-18 16:02 编辑
仅用 dir /tc 拿不到秒级文件创建时间,用%%~tF获取的也只是秒级的文件修改时间,所以批处要拿到秒级的文件创建时间,须借助wmic/jscript/vbs/powershell等外部方法。以下代码调用wmic配合for循环逐个获取秒级文件创建时间可谓 ‘良配’,若改用jscript/vbs/powershel等脚本获取就不如干脆一把包圆了...
代码对遭遇重名的处理对策是反复调用子过程 :checkF 直至适配出一个不重名的新文件名为止
- @echo off &setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b/a-d') do (
- set "F=%%~fa" &set "F=!F:\=\\!"
- for /f "tokens=2 delims=.=" %%b in (
- ' wmic datafile where "name='!F!'" get creationdate /value^|find /v "" ') do (
- set "nF=%%b"&set "nF=!nF:~0,8!_!nF:~8!"&set "xF=%%~xa"&set "n="
- if exist "!nF!%%~xa" (call :checkF)
- ren "%%~fa" "!nF!%%~xa"
- )
- )
- endlocal&pause&exit/b
- :checkF
- set/a "n+=1" &if exist "!nF!_!n!!xF!" goto :checkF
- set "nF=!nF!_!n!"&exit/b
复制代码
作者: jzmaker 时间: 2024-7-23 22:23
回复 5# ShowCode
那修改时间应该怎么写
作者: 77七 时间: 2024-7-24 00:18
回复 7# jzmaker
在论坛内搜索下,看看能不能找到同样的问题贴。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |