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

[文本处理] [已解决]求助批处理文件名批量修改使其带有修改日期的后缀

本帖最后由 jave000 于 2025-1-15 10:18 编辑

实际需求:
现有若干文件,带有原始名称。但是过一段时间会收到更新版文件,名称一样。这时我想提前处理,把旧的文件批量改名为带有修改日期作为后缀的,用于备份。
具体想法:
运行时把程序所在文件夹内所有指定格式文件(多种格式,反正不会是bat和cmd后缀)的文件名,判断是否有代码中对应格式的日期后缀,如果有,不动;如果没有,批量改名,添加修改日期作为后缀。

谢谢
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 aloha20200628 于 2025-1-15 18:58 编辑

回复 1# jave000

代码预设 ‘目标目录’ 为 c:\test(可自定义),其中 ‘修改时间’ 自2024年开始,用本脚本处理之前的文件名后缀时间格式中的分隔符可能有 ‘-’ 或 ‘_’ 或 ‘.’,但用本脚本处理之后的文件名后缀时间格式统一为如 ‘abc.2024-12-26.txt’
  1. @echo off &cd /d "c:\test" &setlocal enabledelayedexpansion
  2. for /f "delims=" %%F in (
  3.    'dir /b/a-d^|findstr /iv "202[4-9][\-_\.][0-9][0-9][\-_\.][0-9][0-9]\." '
  4. ) do if /i "%%~nxF" neq "%~nx0" (set "t=%%~tF" &set "t=!t:/=-!" &ren "%%F" "%%~nF.!t:~,10!%%~xF") 2>nul
  5. pause&exit/b
复制代码
1

评分人数

TOP

回复 2# aloha20200628


    谢谢,运行后没效果,我还是习惯把bat放在需要处理文件的文件夹内运行,因为文件夹五花八门

TOP

本帖最后由 aloha20200628 于 2025-1-7 12:14 编辑

回复 3# jave000

二楼代码已订正,脚本运行时会排除当前目录下已经包含 '202y-mm-dd.' 或 '202y/mm/dd.' 字段的全部文件名,也会排除当前目录下的本脚本文件,即其不会被更名,但新的日期更名格式会采用 '202y-mm-dd' 日期格式 ...

TOP

  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "delims=" %%i in ('dir /b /a-d ^|findstr /rvc:"20[0-9][0-9].*[0-1][0-9].*[0-3][0-9]"') do (
  4. if "%%i" neq "%~nx0" (
  5. for /f "tokens=1-5 delims=/-:. " %%a in ("%%~ti") do (
  6. ren "%%i" "%%~ni_%%a%%b%%c%%d%%e%%~xi"
  7. )
  8. )
  9. )
  10. pause
复制代码
1

评分人数

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

TOP

回复 5# 77七


    谢谢,但是不需要精确到分秒,我改成了
                for /f "tokens=1-3 delims=/-:. " %%a in ("%%~ti") do (
                        ren "%%i" "%%~ni_%%a%%b%%c%%~xi"

请问如何使其支持下一级子文件夹一起改动?或者可选。

TOP

回复 2# aloha20200628


    固定路径确实用不起来,需要先把文件剪切过来,处理后再剪切回去。不过很多是网盘,无法运行,可能确实需要这么操作才行了。

TOP

发现也能识别2024.10.10这样的结构。
为什么年不能彻底识别?只能提供前缀?

TOP

本帖最后由 aloha20200628 于 2025-1-15 18:58 编辑

回复 7# jave000

最初二楼代码中假定一个目标目录其实是为隔离脚本文件,版本被订正后已无此限,脚本所在目录就是目标目录
用本脚本处理之前的文件名后缀时间格式中的分隔符可能有 ‘-’ 或 ‘_’ 或 ‘.’,但用本脚本处理之后的文件名后缀时间格式统一为如 ‘abc.2024-12-26.txt’
另对文件修改时间值可能包含的 ‘/’ 字符现已统一替换为文件名可接受的 ‘-’ 字符
代码已改为还可处理当前目录及其子目录中的目标文件,再试试以下版本吧 ...
  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "delims=" %%F in (
  3.     'dir /b/s/a-d^|findstr /iv "202[4-9][\-_\.][0-9][0-9][\-_\.][0-9][0-9]\." '
  4. ) do if /i "%%~nxF" neq "%~nx0" (set "t=%%~tF" &set "t=!t:/=-!" &ren "%%F" "%%~nF.!t:~,10!%%~xF") 2>nul
  5. pause&exit/b
复制代码
1

评分人数

TOP

回复 6# jave000

  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "delims=" %%x in ('echo "%cd%"^& ^>nul fltmc ^&^& 2^>nul dir /b /ad-h') do (
  4.         echo folder : [%%~x]
  5.         pushd "%%~x"
  6.         for /f "delims=" %%i in ('2^>nul dir /b /a-d ^|findstr /rvc:"20[0-9][0-9].*[0-1][0-9].*[0-3][0-9]"') do (
  7.                 if "%%i" neq "%~nx0" (
  8.                         for /f "tokens=1-5 delims=/-:. " %%a in ("%%~ti") do (
  9.                                 ren "%%i" "%%~ni_%%a%%b%%c%%d%%e%%~xi"
  10.                                 echo ren "%%i" "%%~ni_%%a%%b%%c%%d%%e%%~xi"
  11.                         )
  12.                 )
  13.         )
  14.         popd
  15. )
  16. pause
复制代码

   右键管理员执行则支持批处理所在目录 与 子文件夹,否则只处理前者;20指2025的前两位,缩小范围防止过多匹配...;精确到时分防止一小时内操作二次
1

评分人数

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

TOP

回复 10# 77七


    我是想问年能不能也纯粹靠读取。因为很多天才会更新一次,如果有当天的,直接覆盖即可。
当前也够用了,我学习一下自己修改。谢谢

TOP

回复 11# jave000


   [0-9] 表示 数字0-9其中任意一位,因为 年份20xx的20是固定的,21世纪内是够用的,所以直接写20就行了,写成[2][0]?
bat小白,请多指教!谢谢!

TOP

本帖最后由 208785224 于 2025-1-17 16:11 编辑
  1. echo off&setlocal enabledelayedexpansion
  2. for %%i in (*) do (
  3. set a=%%~ti
  4. set a=!a:/=!
  5. set a=!a:~0,8!
  6. set b=%%~ni
  7. set b=!b:~-8!
  8. if !b! neq !a! ren "%%i" "%%~ni-!a!%%~xi"
  9. )
  10. pause
复制代码
1

评分人数

TOP

返回列表