
标题: [文本处理] [已解决]求助批处理文件名批量修改使其带有修改日期的后缀 [打印本页]
作者: jave000 时间: 2024-12-26 14:00 标题: [已解决]求助批处理文件名批量修改使其带有修改日期的后缀
本帖最后由 jave000 于 2025-1-15 10:18 编辑
实际需求:
现有若干文件,带有原始名称。但是过一段时间会收到更新版文件,名称一样。这时我想提前处理,把旧的文件批量改名为带有修改日期作为后缀的,用于备份。
具体想法:
运行时把程序所在文件夹内所有指定格式文件(多种格式,反正不会是bat和cmd后缀)的文件名,判断是否有代码中对应格式的日期后缀,如果有,不动;如果没有,批量改名,添加修改日期作为后缀。
谢谢
作者: aloha20200628 时间: 2024-12-26 14:39
本帖最后由 aloha20200628 于 2025-1-15 18:58 编辑
回复 1# jave000
代码预设 ‘目标目录’ 为 c:\test(可自定义),其中 ‘修改时间’ 自2024年开始,用本脚本处理之前的文件名后缀时间格式中的分隔符可能有 ‘-’ 或 ‘_’ 或 ‘.’,但用本脚本处理之后的文件名后缀时间格式统一为如 ‘abc.2024-12-26.txt’- @echo off &cd /d "c:\test" &setlocal enabledelayedexpansion
- for /f "delims=" %%F in (
- 'dir /b/a-d^|findstr /iv "202[4-9][\-_\.][0-9][0-9][\-_\.][0-9][0-9]\." '
- ) do if /i "%%~nxF" neq "%~nx0" (set "t=%%~tF" &set "t=!t:/=-!" &ren "%%F" "%%~nF.!t:~,10!%%~xF") 2>nul
- pause&exit/b
复制代码
作者: jave000 时间: 2025-1-7 09:07
回复 2# aloha20200628
谢谢,运行后没效果,我还是习惯把bat放在需要处理文件的文件夹内运行,因为文件夹五花八门
作者: aloha20200628 时间: 2025-1-7 12:02
本帖最后由 aloha20200628 于 2025-1-7 12:14 编辑
回复 3# jave000
二楼代码已订正,脚本运行时会排除当前目录下已经包含 '202y-mm-dd.' 或 '202y/mm/dd.' 字段的全部文件名,也会排除当前目录下的本脚本文件,即其不会被更名,但新的日期更名格式会采用 '202y-mm-dd' 日期格式 ...
作者: 77七 时间: 2025-1-7 16:53
- @echo off
- cd /d "%~dp0"
- 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 (
- if "%%i" neq "%~nx0" (
- for /f "tokens=1-5 delims=/-:. " %%a in ("%%~ti") do (
- ren "%%i" "%%~ni_%%a%%b%%c%%d%%e%%~xi"
- )
- )
- )
- pause
复制代码
作者: jave000 时间: 2025-1-15 10:12
回复 5# 77七
谢谢,但是不需要精确到分秒,我改成了
for /f "tokens=1-3 delims=/-:. " %%a in ("%%~ti") do (
ren "%%i" "%%~ni_%%a%%b%%c%%~xi"
请问如何使其支持下一级子文件夹一起改动?或者可选。
作者: jave000 时间: 2025-1-15 10:14
回复 2# aloha20200628
固定路径确实用不起来,需要先把文件剪切过来,处理后再剪切回去。不过很多是网盘,无法运行,可能确实需要这么操作才行了。
作者: jave000 时间: 2025-1-15 10:21
发现也能识别2024.10.10这样的结构。
为什么年不能彻底识别?只能提供前缀?
作者: aloha20200628 时间: 2025-1-15 12:21
本帖最后由 aloha20200628 于 2025-1-15 18:58 编辑
回复 7# jave000
最初二楼代码中假定一个目标目录其实是为隔离脚本文件,版本被订正后已无此限,脚本所在目录就是目标目录
用本脚本处理之前的文件名后缀时间格式中的分隔符可能有 ‘-’ 或 ‘_’ 或 ‘.’,但用本脚本处理之后的文件名后缀时间格式统一为如 ‘abc.2024-12-26.txt’
另对文件修改时间值可能包含的 ‘/’ 字符现已统一替换为文件名可接受的 ‘-’ 字符
代码已改为还可处理当前目录及其子目录中的目标文件,再试试以下版本吧 ...- @echo off &setlocal enabledelayedexpansion
- for /f "delims=" %%F in (
- 'dir /b/s/a-d^|findstr /iv "202[4-9][\-_\.][0-9][0-9][\-_\.][0-9][0-9]\." '
- ) do if /i "%%~nxF" neq "%~nx0" (set "t=%%~tF" &set "t=!t:/=-!" &ren "%%F" "%%~nF.!t:~,10!%%~xF") 2>nul
- pause&exit/b
复制代码
作者: 77七 时间: 2025-1-15 17:17
回复 6# jave000
- @echo off
- cd /d "%~dp0"
- for /f "delims=" %%x in ('echo "%cd%"^& ^>nul fltmc ^&^& 2^>nul dir /b /ad-h') do (
- echo folder : [%%~x]
- pushd "%%~x"
- 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 (
- if "%%i" neq "%~nx0" (
- for /f "tokens=1-5 delims=/-:. " %%a in ("%%~ti") do (
- ren "%%i" "%%~ni_%%a%%b%%c%%d%%e%%~xi"
- echo ren "%%i" "%%~ni_%%a%%b%%c%%d%%e%%~xi"
- )
- )
- )
- popd
- )
- pause
复制代码
右键管理员执行则支持批处理所在目录 与 子文件夹,否则只处理前者;20指2025的前两位,缩小范围防止过多匹配...;精确到时分防止一小时内操作二次
作者: jave000 时间: 2025-1-16 17:54
回复 10# 77七
我是想问年能不能也纯粹靠读取。因为很多天才会更新一次,如果有当天的,直接覆盖即可。
当前也够用了,我学习一下自己修改。谢谢
作者: 77七 时间: 2025-1-17 11:22
回复 11# jave000
[0-9] 表示 数字0-9其中任意一位,因为 年份20xx的20是固定的,21世纪内是够用的,所以直接写20就行了,写成[2][0]?
作者: 208785224 时间: 2025-1-17 16:04
本帖最后由 208785224 于 2025-1-17 16:11 编辑
- echo off&setlocal enabledelayedexpansion
- for %%i in (*) do (
- set a=%%~ti
- set a=!a:/=!
- set a=!a:~0,8!
- set b=%%~ni
- set b=!b:~-8!
- if !b! neq !a! ren "%%i" "%%~ni-!a!%%~xi"
- )
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |