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

[文本处理] 【已解决】批处理怎样按一定规则重命名文件(包含子文件夹)?

如题,某   文件夹A     下含有
                                                                      ***[01]***.txt   
                                                                      ***[02]***.txt   
                                                                      ***[03]***.txt   
                                                                          ......
如此命名规则的文件,将文件夹A   拖放到   批处理X  ,

文件重命名为
                                                                     01.txt   
                                                                     02.txt   
                                                                     03.txt   
                                                                       ......
请各位前辈赐教!

(ps.  曾经找到过一段vbs脚本,能达成要求,但必须要复制到文件夹根目录才行,而且,当出现01.MP4时,会重命名为01.txt.txt,很郁闷
  1. Set FSO = CreateObject("Scripting.FileSystemObject")
  2. For Each File in FSO.GetFolder(".").Files
  3.    Ext = FSO.GetExtensionName(File)
  4.    If LCase(Ext) = "txt" Or LCase(Ext) = "doc" Or LCase(Ext) = "ass" Then RenFiles
  5. Next
  6. MsgBox "OK"
  7. Sub RenFiles()
  8.    Set Re = New RegExp
  9.    Re.Pattern = "(^.*\[)(\d{2})(\].*$)"
  10.    Re.Global = True
  11.    File.Name = Re.Replace(File.Name,"$2") & "." & Ext
  12. End Sub
复制代码

嗯,感谢各位的帮助,经过各种各样的过程,总之我已经得到满意结果了,再此感谢给位前辈的不吝赐教!

感谢大家的帮助!!!!

本帖最后由 522235677 于 2014-5-3 17:06 编辑
  1. @echo off
  2. for /f "delims=" %%a in ('dir /b "%~1"') do (
  3.   for /f "tokens=2 delims=[]" %%b in ("%%~nxa") do echo ren "%~1\%%a" "%%b%%~xa"
  4. )
  5. pause
复制代码
先测试,然后去掉echo

TOP

回复 2# 522235677

嗯,有点问题,运行后结果如下:
    [qzgu][Escha&LogynoAtelier~][01][CB].txt

     Escha&LogynoAtelier.txt

TOP

回复 3# ZeronoFreya
  1. @echo off
  2. for /f "delims=" %%a in ('dir /b "%~1"') do (
  3.   for /f "tokens=1,2,3,4,5,6,7,8 delims=[]" %%b in ("%%~nxa") do ren "%~1\%%a" "%%b%%c%%d%%e%%f%%g%%h%%i%%~xa"
  4. )
  5. pause
复制代码
你上面说的也只有一个中括号啊,所以你得说清楚

TOP

回复 3# ZeronoFreya


    那你要保留哪一部分呢?只留数字?

TOP

本帖最后由 g495326 于 2014-5-3 20:48 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. if "%~1" == "" (
  4. set /p path=请输入需要修改的文件夹
  5. if "!path:~2,1!" equ ":" (
  6. set path=!path:~1,-1!
  7. )
  8. ) else (
  9. set path=%~1
  10. )
  11. set /p name=请输入需要修改的文件名,可以包含通配符:
  12. set /p order=请输入排序方式^(n:名称;e:扩展名;d:时间;s:大小;-:否定^):
  13. set /p main=设置需要修改成的文件名的公共部分:
  14. set /p num=请输入开始序列(直接回车默认为1)
  15. if not defined num (
  16. set num=1
  17. )
  18. echo.
  19. for /f "delims=" %%i in ('dir /a-d /b /o%order% "%path%\%name%"') do (
  20. if "%%i" neq "%~nx0" (
  21. echo 正在处理: "%path%\%%i"
  22. ren "%path%\%%i" %main%!num!%%~xi
  23. set /a num+=1
  24. )
  25. )
  26. echo.
  27. echo All Done
  28. echo Press any key to exit
  29. pause>nul
复制代码

TOP

本帖最后由 ZeronoFreya 于 2014-5-4 11:43 编辑

回复 5# CrLf


    嗯,只留数字,数值范围在00-99,

TOP

有没有种情况 那么怎么处理的
[02][Escha&LogynoAtelier~][01][CB].txt

TOP

本帖最后由 apang 于 2014-5-3 23:14 编辑
  1. @set @n=0;/* & echo off
  2. if "%~1" == "" echo,请拖拽文件夹&pause&exit
  3. if not exist "%~1\" echo,请拖拽文件夹&pause&exit
  4. pushd "%~1\"
  5. for /f "delims=" %%a in ('dir/b/s *.txt^|cscript -nologo -e:jscript %0')do (
  6.     echo,Ren %%a 2>nul
  7. )
  8. pause & exit/b & rem */
  9. while (!WScript.StdIn.AtEndOfStream) {
  10.     f = WScript.StdIn.ReadLine();
  11.     name = f.replace(/.*?\[(\d{2})][^\\]*$/, "$1");
  12.     if (f != name) {
  13.         WScript.StdOut.WriteLine('"' + f + '" "' + name + '.txt"');
  14.     };
  15. }
复制代码

TOP

本帖最后由 CrLf 于 2014-5-4 02:31 编辑

有 sed 可以这样:
  1. @dir /s /a-d /b *.txt | sed "s/.*\[\([0-9][0-9]\)\][^\\]*/ren \"^&\" \"\1.txt\"/;ta;d;:a" | cmd
复制代码

TOP

本帖最后由 CrLf 于 2014-5-4 02:31 编辑

有 gawk 可以这样:
  1. @dir /s /a-d /b *.txt | gawk -F "\\" "{q=\"\x22\";if(match($NF,\"\\[[0-9]{2}\\]\",a))system(\"cmd /c ren\",q $NF q,q substr(a[0],2,2) \".txt\" q)}"
复制代码

TOP

本帖最后由 CrLf 于 2014-5-4 03:22 编辑

本来想贴个 powershell 方案的,但试了下这么简单的事竟然在 xp 和 win7 下都报错,什么原因?
  1. (Get-ChildItem -Recurse *.txt) -Match "\[\d\d\]" | Rename-Item -NewName {$_.name -replace '.*\[(\d\d)\].*','$1.txt'}
复制代码
测试中对 te[01]st.txt 报错如下,而改成匹配 te(01)st.txt 却能正确执行:
Rename-Item : 无法重命名,因为“te[01]st.txt”处不存在项。
......

再测试下最简单的 ReName-Item 'test.txt' 'test[0].txt' 同样会报错,这是 bug 还是另有什么隐晦的规矩?
百度不到,搞不明白咋回事,哪位知道的能否指点个?拜谢~

TOP

加参数 I 有用不

TOP

修改自 9 楼 apang 胸的代码:
  1. @set @n=0;/* & echo off
  2. if "%~1" == "" echo,请拖拽文件夹&pause&exit
  3. if not exist "%~1\" echo,请拖拽文件夹&pause&exit
  4. pushd "%~1\"
  5. for /f "delims=" %%a in ('dir/b/s *.txt^|findstr "\[[0-9][0-9]\][^\\]*$"^|cscript -nologo -e:jscript %0')do (
  6.     Ren %%a 2>nul
  7. )
  8. pause & exit/b */
  9. var text = WScript.StdIn.ReadAll().replace(/\r|\n$/g,'')
  10. WScript.Echo(text.replace(/^(.*?[^\\]*\[(\d{2})\][^\\]*)$/gm, '"$1" "$2.txt"'))
复制代码
代码会短一些,但可读性其实很差

TOP

本帖最后由 terse 于 2014-5-4 11:53 编辑

没考虑子目录 修正
ps不考虑效率
  1. (Get-ChildItem  * -Recurse -include "*.txt") -Match "\[\d\d\]" | % {$_.MoveTo($_.DirectoryName + ($_.name -Replace '.*\[(\d{2})\].*','\$1.txt'))}
复制代码
加个参数 literalpath
  1. (Get-ChildItem  * -Recurse -include "*.txt") -Match "\[\d\d\]" | foreach { move-item -LiteralPath  $_ ($_.DirectoryName + ($_.Name -Replace '.*\[(\d\d)\].*','\$1.txt'))}
复制代码

TOP

返回列表