如何用提取文本文件内第一行作为该文件文件名【批处理】

2024-11-02 21:17:21
推荐回答(2个)
回答1:

答复已补充:
你如果确认第一行就是要的标题而不是空行或其它的话,那么应该就样:
@echo off
for %%a in ("*.txt") do (call:ChangName "%%a")
goto :eof

:ChangName
for /f "usebackq delims=" %%h in ("%1") do (ren "%1" "%%h.txt"&goto :eof)
goto:eof

问题有2:1.为什么你要用skip=2跳过头2行呢?
2.for是一个循环,你不停止它,它就会一直的运行下去,虽然理论上不会再对ren产生影响了,但是很耗资源的

特别要注意的是你用了usebackq参数,那么%1就得加上""了,这样FOR才认为它是一个文件,后面的也加上,以免路径有空格时发生错误敏裂。

如果你不确定第一行是不是空行的话可以参照一楼的兄弟判断的语桥段闭句(稍燃枝做更改):
for ......(
setlocal enabledelayedexpansion
set "var=%%i"
if defined var (ren "%1" "%%i.txt" & goto :eof)
set var=)

发现问题了,楼主说在中途停止反而正确的多,问题在于第一句
for %%a in (*.txt) do (call:ChangName "%%~a")
当你更改文件名时,for会对更改后的文件再次遍历,所以先导出文件名再做更改的动作吧,第一段更改如下:
@echo off
dir /b *.txt>>%temp%\dirlist.txt
for /f "usebackq delims=" %%a in ("%temp%\dirlist.txt") do (call:ChangName "%%a")
goto :eof

回答2:

补充回答键液冲,“不正埋乱常”的回车换行能处理的,稿歼特殊字符无能为力
@echo off
for %%a in (*.txt) do (call:ChangName "%%~a")
pause&exit

:ChangName
>nul set /p var=<"%~1"
ren "%~1" "%var%.txt"
set var=
goto:eof