[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程批处理在线视频分享
返回列表 发帖

[文件操作] 【已解决】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?
我是不是有点作...:Q
1

评分人数

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

  1. ren "%%i" "%%~ni%datetime%.*"
复制代码
加上双引号试试能否解决空格问题
【扫描二维码捐助论坛的朋友请留言注明论坛账号】http://bbs.bathome.net/thread-10403-1-1.html
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

TOP

回复 2# Batcher

奇怪!貌似还没生效...

TOP

回复 2# Batcher
加双引号后还需要在变量前面添加"delims="才生效。
继续琢磨依次插入的问题:Q

TOP

回复 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%
复制代码
1

评分人数

    • holley: 非常感谢,只有这个额度。技术 + 1
【扫描二维码捐助论坛的朋友请留言注明论坛账号】http://bbs.bathome.net/thread-10403-1-1.html
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

TOP

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

回复 5# Batcher


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

日期时间的问题倒是不用深究,,本来就是一时兴起 测试玩玩:lol

TOP

回复 5# Batcher


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

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

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

短文件名如:批量重命名1.bat、批量重命名2.bat、批量重命名3.bat
则修改正常。

TOP

  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%.*"
复制代码
1

评分人数

    • holley: 有效!多谢解答!技术 + 1

TOP

回复 7# holley


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

根据顶楼的要求,取文件名的前15位和日期时间交叉组成新文件名,出现重名是有可能的。
根据你的最新规则,遇到这种情况希望如何处理呢?
【扫描二维码捐助论坛的朋友请留言注明论坛账号】http://bbs.bathome.net/thread-10403-1-1.html
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

TOP

回复 9# Batcher
理解你说的意思,也回过神来了:lol ,多谢你们的解答!我结贴吧。

TOP

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

TOP

返回列表