Board logo

标题: [文件操作] 【已解决】BAT脚本批量个性化的文件名修改问题 [打印本页]

作者: holley    时间: 2018-10-6 21:37     标题: 【已解决】BAT脚本批量个性化的文件名修改问题

本帖最后由 holley 于 2018-10-8 15:05 编辑

最初打算将某个文件夹内的所有文件在原文件名的基础上截取字段并随机命名
1、首先试了试随机命名的代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir/s/b/a-d F:\pcsofts\test\') do ren "%%a" !random!!random!.*
  4. pause
复制代码
2、后面在做文件名截取的时候突然发现,文件名长度多数不一致,而且共同特征不明显,遂放弃。
3、再想到不如索性以当前日期、时间依次按1个字符的步长穿插到原文件名中
4、先尝试直接加在原文件名后面
  1. @echo off
  2. set datetime=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
  3. echo %datetime%
  4. for /f %%i in ('dir /s/a-d /b F:\pcsofts\test\') do ren %%i %%~ni%datetime%.*
  5. pause
复制代码
目前有个问题是:如果文件名中有空格 是加不上的,不知道咋个处理...
【已解决】
  1. @echo off
  2. set datetime=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
  3. echo %datetime%
  4. for /f "delims=" %%i in ('dir /s/a-d /b F:\pcsofts\test\') do ren "%%i" "%%~ni%datetime%.*"
  5. pause
复制代码
5、开始尝试按文件名长度,依次插入
比如文件名是filename,插入完成后应该变为:f2i0l1e8n1a0m0e6
如果文件名不够,就不再插入,比如file只需要变成f2i0l1e8
如果文件名足够长,就把文件名截取到日期时间完全插入完毕为止,比如现在是21点31分49秒,插入完后文件名称filefilefilefilenameeeeee变成f2i0l1e8f1i0l0e6f2i1l3e1f4i9l即可。
到这步就再次卡住了,,,不知道以什么方式插入原文件名 step还是for?
我是不是有点作...
作者: Batcher    时间: 2018-10-7 12:43

  1. ren "%%i" "%%~ni%datetime%.*"
复制代码
加上双引号试试能否解决空格问题
作者: holley    时间: 2018-10-7 17:31

回复 2# Batcher

奇怪!貌似还没生效...
作者: holley    时间: 2018-10-7 17:40

回复 2# Batcher
加双引号后还需要在变量前面添加"delims="才生效。
继续琢磨依次插入的问题
作者: Batcher    时间: 2018-10-7 19:42

回复 4# holley
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. REM 这种方法获取的日期时间可能是错误的,参考:http://bbs.bathome.net/thread-3328-1-1.html
  4. set datetime=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
  5. for /f "delims=" %%i in ('dir /s /a-d /b "F:\pcsofts\test\"') do (
  6.     call :GetStrLen "%%~ni" length
  7.     set "oldname=%%~ni"
  8.     set "newname="
  9.     set /a offset=length-1
  10.     for /l %%j in (0,1,!offset!) do (
  11.         if %%j lss 14 (
  12.             set newname=!newname!!oldname:~%%j,1!!datetime:~%%j,1!
  13.         ) else if %%j equ 14 (
  14.             set newname=!newname!!oldname:~%%j,1!
  15.         )
  16.     )
  17.     ren "%%i" "!newname!"%%~xi
  18. )
  19. endlocal
  20. goto :eof
  21. :GetStrLen
  22. setlocal enabledelayedexpansion
  23. set "$=%1"
  24. set len=&for %%a in (256 128 64 32 16 8 4 2 1)do if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
  25. endlocal&If %2. neq . (set/a%2=%len%-1)else echo %len%
复制代码

作者: holley    时间: 2018-10-7 20:01

本帖最后由 holley 于 2018-10-7 20:13 编辑

回复 5# Batcher


    非常感谢!我先研究研究!

日期时间的问题倒是不用深究,,本来就是一时兴起 测试玩玩
作者: holley    时间: 2018-10-7 20:11

回复 5# Batcher


    基本上已经相当完整了,还在学习中。

暂时发现一个小bug:
短文件名不会出现,长的会出现一个问题
比如文件名:
源代码canvas鼠标移动动态星空背景特效1.txt
源代码canvas鼠标移动动态星空背景特效2.txt

运行会提示重名 只会修改其中一个

短文件名如:批量重命名1.bat、批量重命名2.bat、批量重命名3.bat
则修改正常。
作者: flashercs    时间: 2018-10-7 21:07

  1. @echo off
  2. set datetime=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
  3. echo %datetime%
  4. for /f "delims=" %%i in ('dir /s/a-d /b F:\pcsofts\test\') do call :rf "%%i"
  5. exit /b
  6. :rf
  7. set "fn=%~n1"
  8. set /a "i=0"
  9. set s=
  10. :loop
  11. call set "s1=%%fn:~%i%,1%%"
  12. if not defined s1 goto next
  13. call set "s2=%%datetime:~%i%,1%%">nul
  14. if not defined s2 (
  15.     call set "s=%s%%%fn:~%i%%%">nul
  16.     goto next
  17. )
  18. set "s=%s%%s1%%s2%"
  19. set /a "i+=1"
  20. goto loop
  21. :next
  22. REM echo,"%s%"
  23. ren %1 "%s%.*"
复制代码

作者: Batcher    时间: 2018-10-7 22:20

回复 7# holley


插入完后文件名称filefilefilefilenameeeeee变成f2i0l1e8f1i0l0e6f2i1l3e1f4i9l即可

根据顶楼的要求,取文件名的前15位和日期时间交叉组成新文件名,出现重名是有可能的。
根据你的最新规则,遇到这种情况希望如何处理呢?
作者: holley    时间: 2018-10-8 15:04

回复 9# Batcher
理解你说的意思,也回过神来了 ,多谢你们的解答!我结贴吧。
作者: holley    时间: 2018-10-8 15:08

回复 8# flashercs
你的方案 插入生效了 但如果文件名过长 没有丢弃文件名过长的部分




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2