找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 109004|回复: 29

[文本处理] [已解决]批处理怎样批量提取TXT文件第一行对文件进行改名?

[复制链接]
发表于 2010-6-18 11:19:45 | 显示全部楼层 |阅读模式
如题,一个目录下有大量TXT文件,文件名可能是1.txt, 2.txt ,3.txt……  每个TXT文件的内容格式如下:

这是文件标题这是文件标题

这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容。


现在想把每个TXT文件改名,即用每个TXT文件的第一行内容作为标题,同时删除内容中的第一行和第二行空行,处理后TXT文件内容变成:

这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容这是文件内容。


请问批处理该怎么写呢

[ 本帖最后由 zxzl 于 2010-6-21 23:57 编辑 ]

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢主动给标题标注[已解决]字样

查看全部评分

发表于 2010-6-18 11:58:35 | 显示全部楼层
  1. @echo off
  2. for %%a in (*.txt) do (
  3.    setlocal enabledelayedexpansion
  4.    (for /F "usebackq delims=" %%b in ("%%a") do (
  5.       if defined b (echo.%%b) else set "a=%%b"
  6.       set b==
  7.    ))>$
  8.    ren $ "!a!.txt"
  9.    del /q /f "%%a"
  10.    Endlocal
  11. )
复制代码

[ 本帖最后由 hanyeguxing 于 2010-6-18 13:26 编辑 ]
 楼主| 发表于 2010-6-18 12:47:10 | 显示全部楼层
你好孤星,我运行了你给的批处理之后,TXT文件的标题可以成功改名,但是TXT文件内容的原第1、2行还在并没有删除?
发表于 2010-6-18 12:49:59 | 显示全部楼层
批处理更改文本文件名为该文件的第一行内容
http://bbs.bathome.net/thread-287-1-1.html
发表于 2010-6-18 12:58:49 | 显示全部楼层
原帖由 zxzl 于 2010-6-18 12:47 发表
你好孤星,我运行了你给的批处理之后,TXT文件的标题可以成功改名,但是TXT文件内容的原第1、2行还在并没有删除?
忘记加输出了,已在2楼修改。
 楼主| 发表于 2010-6-18 13:13:04 | 显示全部楼层
忘记加输出了,已在2楼修改。


试了下修改过的,可是运行后把当前文件夹下的所有TXT文件都删除了
 楼主| 发表于 2010-6-18 14:08:12 | 显示全部楼层
又试了一下还是不行,运行后还是全部删除,只生成一个$文件
发表于 2010-6-18 16:48:31 | 显示全部楼层
我觉得用set/p=<和more+2会好一点
 楼主| 发表于 2010-6-18 17:28:37 | 显示全部楼层
原帖由 Seter 于 2010-6-18 16:48 发表
我觉得用set/p=


能否给个完整的代码呢?
发表于 2010-6-18 21:07:23 | 显示全部楼层
我感觉在这两句前加个PAUSE就可以
ren $ "!a!.txt"
del /q /f "%%a"
我写代码的时候遇到这两个命令时要加pause暂停一下,然后才能修改成功。
发表于 2010-6-18 21:33:37 | 显示全部楼层

回复 2楼 的帖子

給2楼代码提点建议
1、ren 重命名文件最好不要用for直接遍历文件,会有bug
2、既然把setlocal enabledelayedexpansion放在for内部,说明考虑到文件内容和文件名特殊符号的问题,那么就不应该再是echo.%%b而是应该先set num=%%b再echo.!num!,同时 del 当然也不能 %%a 而应先赋值給变量,或者把del语句放在  endlocal 后面。
3、楼主说还是不行,(我也没测试)但估计是()包起for再>$ 所致,建议改成echo.!Num!>>$或者給for再加对()试试。
  ((for /F "usebackq delims=" %%b in ("%%a") do (
      if defined b (echo.%%b) else set "a=%%b"
      set b==
   )))>$
未测试。。。只是好像依稀记得遇到过此问题。
 楼主| 发表于 2010-6-18 22:54:06 | 显示全部楼层
原帖由 随风 于 2010-6-18 21:33 发表
給2楼代码提点建议
1、ren 重命名文件最好不要用for直接遍历文件,会有bug
2、既然把setlocal enabledelayedexpansion放在for内部,说明考虑到文件内容和文件名特殊符号的问题,那么就不应该再是echo.%%b而是应该先 ...


不知随风版主能否给个完善点的代码?我对编程这方面不太懂,谢谢了
发表于 2010-6-18 23:36:06 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.txt) do (
  4. for /f "tokens=1,* delims=:" %%a in ('findstr /n .* "%%a"') do (
  5.   if %%a equ 1 set name=%%b
  6.   if %%a geq 3 (echo.%%b >>!name!.txt)
  7. )
  8. del /q /f "%%a"
  9. )
  10. endlocal
  11. pause
复制代码
不知道是不是这样呢,我测试是可以的
发表于 2010-6-18 23:47:37 | 显示全部楼层
13楼同样未考虑到文件名及内容含!号的问题,并且如此使用findstr对效率是个大影响,如果文件数量过多的话。且未考虑到以冒号开头的行
8楼的思路
  1. @echo off
  2. for %%a in (*.txt) do (
  3.    set /p num=<"%%a"
  4.    set "wjm=%%~nxa"
  5.    setlocal enabledelayedexpansion
  6.    more +2 "!wjm!">tem
  7.    move tem "!num!.txt"
  8.    del /q "!wjm!"
  9.    endlocal
  10. )
  11. pause
复制代码

[ 本帖最后由 随风 于 2010-6-19 01:21 编辑 ]
发表于 2010-6-19 05:39:10 | 显示全部楼层
为什么不直接
more +2 "!wjm!">"!num!.txt"
del /q "%%a"
可以不用临时文件吧。

还有一个问题使用>,但是假如有两个以上的文本第一行相同但内容可能不同(比如是一个完整的文章分成了几个文本)时该怎么办呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 18:06 , Processed in 0.036335 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表