求批处理! 批量读取每个TXT文本的第一行内容作为文件名.

只有20财富求个批处理.
同一文件夹内有上千个.txt文件 ,这上千个TXT文件名称没有规律.现在需要读取每个文本内容的第一行的前五个字作为此文件的文件名.
求会批处理的出手.谢谢!

第1个回答  2017-06-29
@echo off
setlocal enabledelayedexpansion

for /r %%a in (*.txt) do (
    set /p Str=<"%%~a"
    ren "%%~a" "!Str:~,5!%%~xa"
)
pause

追问


批处理试了下.有些改不了.提示如图!

追答

可能有些文本第一行的开头5个字符相同,所以导致无法正常重命名。
这样吧!你希望出现同名的,怎么处理?增加序号,还是?

追问

可以加序号.加在文字的尾部.谢谢!

追答@echo off
setlocal enabledelayedexpansion
 
for /r %%a in (*.txt) do (
    set /p Str=<"%%~a"
    set "num="
    for /r %%b in ("!Str:~,5!*.rentmp") do set /a num+=1
    if defined num (
        ren "%%~a" "!Str:~,5!_!num!.rentmp"
    ) else (
        ren "%%~a" "!Str:~,5!.rentmp"
    )
)
ren *.rentmp *.txt
pause

追问

谢谢.大部分的都已成功处理.还有一小部分文本的第一行有特殊符号(/*\等)的会出现错误.如果有时间帮我再改下吧,没时间的话,我自己手动处理.谢谢!

追答

/*\这些特殊字符是不允许当成文件名的,所以会报错。这样吧,我把它们变成可命名的符号吧!

@echo off

(echo Str=Replace^(WScript.Arguments^(0^),WScript.Arguments^(1^),WScript.Arguments^(2^)^)
echo Wscript.Echo Str
echo Wscript.Quit)>Replace.VBS

for /r %%a in (*.txt) do (
    set /p Str=<"%%~a"
    call set "Str=%%Str:~,5%%"
    call set "Str=%%Str:"="%%"
    call :Replace "%%Str%%" "!" "!"
    call :Replace "%%Str%%" "*" "*"
    call :Replace "%%Str%%" "/" "/"
    call :Replace "%%Str%%" "\" "\"
    call :Replace "%%Str%%" ":" "∶"
    call :Replace "%%Str%%" "?" "?"
    call :Replace "%%Str%%" "|" "丨"
    call :Replace "%%Str%%" "<" "〈"
    call :Replace "%%Str%%" ">" "〉"
    call :CheckExist "%%Str%%"
    if defined num (
        call echo 正在将 "%%~nxa" 重命名为 "%%Str%%_%%num%%%%~xa"
        call ren "%%~a" "%%Str%%_%%num%%.rentmp"
    ) else (
        call echo 正在将 "%%~nxa" 重命名为 "%%Str%%%%~xa"
        call ren "%%~a" "%%Str%%.rentmp"
    )
)
rem 郁闷,代码有点长,这里一下子不能全部贴上来
rem 请自行拼接上后面的代码


代码有点长了,超过回答字数,请麻烦你追答一下后,我再贴出后面的代码。

追问

辛苦了.

追答

rem 请拼接到上面的代码中去
del Replace.VBS
ren *.rentmp *.txt
echo, & echo 重命名完成
pause
exit

:CheckExist
set "num="
for /r %%i in ("%~1*.rentmp") do set /a num+=1
goto :eof

:Replace
for /f "delims=" %%i in ('cscript /nologo Replace.VBS "%~1" "%~2" "%~3"') do set "Str=%%~i"
goto :eof

本回答被提问者和网友采纳
相似回答