Board logo

标题: [文件操作] [已解决]批处理怎样在文件名中的数字前加上0/补零/补0? [打印本页]

作者: QIAOXINGXING    时间: 2011-9-28 13:12     标题: [已解决]批处理怎样在文件名中的数字前加上0/补零/补0?

本帖最后由 pcl_test 于 2016-7-15 18:13 编辑

把文件名的数字改成相同的位数,举个例子
有一些文件的名字是:小说1.txt  小说2.txt 小说3.txt ...............小说23.txt   小说24.txt
怎么用批处理改成 :小说01.txt  小说02.txt 小说03.txt ...............小说23.txt   小说24.txt
作者: CrLf    时间: 2011-9-28 14:51

for /l %%a in (1 1 9) do ren 小说%%a.txt 小说0%%a.txt
作者: QIAOXINGXING    时间: 2011-9-28 15:20

回复 2# CrLf


    多谢版主!
不过我这只是举个例子,还有其他一些文件,数字有的在前有的在后,还有的数字是从1到几百,不知道您能不能写一个通用版的。
再次感谢版主!!
作者: ArdentMan    时间: 2011-9-28 15:57

本帖最后由 ArdentMan 于 2011-9-28 15:58 编辑

以下代码在数字三位内通用:
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For /F "delims=" %%a In ('Dir /b /s') Do (
  3.   For /F "delims=0123456789" %%b In ("%%~na") Do Call :LP "%%a" "%%b"
  4. )
  5. Exit
  6. :LP
  7. For /F "delims=%~2" %%a In ("%~n1") Do (
  8.   Set "Num=000%%a"&Set "Num=!Num:~-3!"
  9.   For %%b In (!Num!) Do Set "Str=%~n1"&Ren %1 "!Str:%%a=%%b!"
  10. )
复制代码

作者: QIAOXINGXING    时间: 2011-9-28 16:59

回复 4# ArdentMan

多谢前辈!!
我测试了一下,确实不错!!
但是有点小bug,下面这种文件名的改不了:
1  ee.txt
1e  e.txt
1.txt
e  e1.txt
作者: HAT    时间: 2011-9-28 17:02

回复 5# QIAOXINGXING


请别人写代码之前,你得自己先把规律总结出来。
什么东西都没有,只是说别人的代码不通用,这怎么可以呢。
1a1.txt、1a12b123.txt这样的文件你准备怎样重命名?
作者: ArdentMan    时间: 2011-9-28 17:32

本帖最后由 ArdentMan 于 2011-9-28 17:34 编辑

请测试:
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For /F "delims=" %%a In ('Dir /b /s') Do (
  3.   Set "Str=%%~na"
  4.   For /L %%b In (0,1,9) Do Set "Str=!Str:%%b=!"
  5.   Call :LP "%%a" "@!Str!"
  6. )
  7. Exit
  8. :LP
  9. For /F "delims=%~2" %%a In ("%~n1") Do (
  10.   Set "Num=000%%a"&Set "Num=!Num:~-3!"
  11.   For %%b In (!Num!) Do Set "Str=%~n1"&Ren %1 "!Str:%%a=%%b!"
  12. )
复制代码

作者: QIAOXINGXING    时间: 2011-9-28 20:10

本帖最后由 QIAOXINGXING 于 2011-9-28 20:12 编辑

回复 6# HAT


    前辈教训的是,我一定尽量改正。只是现在我实在太菜了,稍复杂的语句就看不懂了。。
作者: HAT    时间: 2011-9-28 20:27

回复 8# QIAOXINGXING


看不懂没关系,把需求描述清楚就行了,会有人帮你写代码的。
作者: QIAOXINGXING    时间: 2011-9-28 21:32

回复 9# HAT


再次感谢前辈!!
经测试,纯数字为文件名的(即:1.txt型的)可以了,但是其他几种依旧不行。
我试图看懂代码,但是。。。。。。。。只能麻烦前辈了。
作者: ArdentMan    时间: 2011-9-28 23:44

本帖最后由 ArdentMan 于 2011-9-28 23:51 编辑

这下应该可以了
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For /F "delims=" %%a In ('Dir /b /s') Do (
  3.   Set "Str=%%~na"
  4.   For /L %%b In (0,1,9) Do If Defined Str Set "Str=!Str:%%b=!"
  5.   If Not Defined Str Set "Str=<"
  6.   If "%%a" NEQ %0 Call :LP "%%a" "!Str: =!"
  7. )
  8. Exit
  9. :LP
  10. For /F "delims=%~2 " %%a In ("%~n1") Do (
  11.   Set "Num=000%%a"&Set "Num=!Num:~-3!"
  12.   For %%b In (!Num!) Do Set "Str=%~nx1"&Ren %1 "!Str:%%a=%%b!"
  13. )
复制代码

作者: missll    时间: 2011-9-29 04:57

膜拜各路大牛。。。。 学习中。
作者: QIAOXINGXING    时间: 2011-9-29 11:29

回复 11# ArdentMan


    实在感谢,的确可以了。
感激不尽啊!!!
作者: pcl_test    时间: 2016-7-15 20:20

本帖最后由 pcl_test 于 2016-7-15 20:34 编辑
  1. /*&cls
  2. @echo off
  3. rem 以文件名中自左向右首个出现的数字串为修改对象
  4. dir /a-d /b *.txt|cscript -nologo -e:jscript "%~f0"
  5. pause&exit
  6. */
  7. var fso = new ActiveXObject('Scripting.FileSystemObject');
  8. var f=[], i=0, zero='00000000000000000000', t;
  9. while(!WSH.StdIn.AtEndOfStream){
  10.     var file = fso.GetFile(WSH.StdIn.ReadLine());
  11.     //获取数字串最长位数
  12.     if(/\D*(\d+).+/.test(file.Name)){
  13.         if(typeof(n) == 'undefined'){
  14.             n = RegExp.$1.length
  15.         }else{
  16.             if(RegExp.$1.length > n)n=RegExp.$1.length;
  17.         }
  18.         f[i] = file;
  19.         i++;
  20.     }
  21. }
  22. for(i--; i>=0; i--){
  23.     var newname = f[i].Name.replace(/\d+/, function(num){t = num.length;return (zero+num).slice(-n)});
  24.     if(t < n)f[i].Name = newname;
  25. }
  26. WSH.echo('Done');
复制代码

作者: ddrwin    时间: 2020-3-12 15:38

回复 14# pcl_test

版主的这个代码太好了!
我增加了一些适配的文件格式,代码执行提升出错,但是不影响结果。请帮忙看看是什么导致?该如何添加文件格式才不会出错?谢谢!!
  1. dir /a-d /b *.txt *.rar *.pdf *.doc *.mov *.torrent *.jpg *.mp4 *.ts *.mkv *.wmv *.avi *.png *.gif *.rmvb|cscript -nologo -e:jscript "%~f0"
复制代码
运行结果:

Done
'*' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'var' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'var' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'while' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'var' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
文件名、目录名或卷标语法不正确。
命令语法不正确。





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