返回列表 发帖

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

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

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

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

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

感谢大家的帮助!!!!

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

TOP

回复 2# 522235677

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

     Escha&LogynoAtelier.txt

TOP

回复 3# ZeronoFreya
@echo off
for /f "delims=" %%a in ('dir /b "%~1"') do (
  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"
)
pauseCOPY
你上面说的也只有一个中括号啊,所以你得说清楚

TOP

回复 3# ZeronoFreya


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

TOP

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

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 编辑
@set @n=0;/* & echo off
if "%~1" == "" echo,请拖拽文件夹&pause&exit
if not exist "%~1\" echo,请拖拽文件夹&pause&exit
pushd "%~1\"
for /f "delims=" %%a in ('dir/b/s *.txt^|cscript -nologo -e:jscript %0')do (
    echo,Ren %%a 2>nul
)
pause & exit/b & rem */
while (!WScript.StdIn.AtEndOfStream) {
    f = WScript.StdIn.ReadLine();
    name = f.replace(/.*?\[(\d{2})][^\\]*$/, "$1");
    if (f != name) {
        WScript.StdOut.WriteLine('"' + f + '" "' + name + '.txt"');
    };
}COPY

TOP

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

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

TOP

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

有 gawk 可以这样:
@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)}"COPY

TOP

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

本来想贴个 powershell 方案的,但试了下这么简单的事竟然在 xp 和 win7 下都报错,什么原因?
(Get-ChildItem -Recurse *.txt) -Match "\[\d\d\]" | Rename-Item -NewName {$_.name -replace '.*\[(\d\d)\].*','$1.txt'}COPY
测试中对 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 胸的代码:
@set @n=0;/* & echo off
if "%~1" == "" echo,请拖拽文件夹&pause&exit
if not exist "%~1\" echo,请拖拽文件夹&pause&exit
pushd "%~1\"
for /f "delims=" %%a in ('dir/b/s *.txt^|findstr "\[[0-9][0-9]\][^\\]*$"^|cscript -nologo -e:jscript %0')do (
    Ren %%a 2>nul
)
pause & exit/b */
var text = WScript.StdIn.ReadAll().replace(/\r|\n$/g,'')
WScript.Echo(text.replace(/^(.*?[^\\]*\[(\d{2})\][^\\]*)$/gm, '"$1" "$2.txt"'))COPY
代码会短一些,但可读性其实很差

TOP

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

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

TOP

返回列表