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

我的文件内容都是如下格式:
深圳公交车
我在深圳生活三年多了,多少有些惆怅,混的不是很好,特别是这个物欲横流的年代,深圳特区更是这样。相比之下人为环境更是糟透了。就拿坐公交车来说吧,我上班在福田,住在南山的家乐福附近,经常坐204或603往返福田和南山。
刚来时,我不大习惯这里的公交车...

我想将第一行作为文件名,原文件名是数字的,有上千个文件,我找到一个批处理能截取里面内容作为文件名的,可是不是这里要的第一行,谁帮我改改?
@echo off
for %%a in ("*.txt") do (call:ChangName "%%a")
goto :eof

:ChangName
for /f "usebackq skip=2 delims= " %%h in (%1) do (ren %1 "%%h.txt")
goto:eof
为什么取出的名字是后面某个段落的整段文字啊?是不是因为第一行后面的不是正常的回车换行啊?那要怎么办?

谢谢两位,可是还是有取出后面段落的结果,一部分成功,怎么办? 我发现执行还没完的时候中断执行反而有更多的文件名弄对了,是怎么回事?能不能设定一个文件只能改名一次?

答复已补充:
你如果确认第一行就是要的标题而不是空行或其它的话,那么应该就样:
@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
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-07-31
补充回答,“不正常”的回车换行能处理的,特殊字符无能为力
@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
相似回答