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

[文件操作] 批处理如何提取txt文本里第一行中的小说名来重命名该文本文件?

[复制链接]
发表于 2011-12-12 11:32:02 | 显示全部楼层 |阅读模式
如何从 txt 的第一行提取书名,并以此为名重命名该 txt?
1《宦海龙腾》全集声明:本书由奇书网(www.Qisuu.……
2《以鼠之名》全集
 楼主| 发表于 2011-12-12 12:33:26 | 显示全部楼层
代码已经修改!
  1. setlocal EnableDelayedExpansion
  2. if not exist 小说提取目录 md 小说提取目录
  3. :l
  4. set n=0
  5. for /f %%a in ('dir /b 2*.txt') do (  
  6.    for /f "delims=全集 tokens=1" %%b in (%%a) do (
  7.    set /a n+=1
  8.    if !n! == 1 (move %%a 小说提取目录\%%b.txt) else (
  9.     if !n! == 2 goto l
  10. )
  11. )     
  12. )

  13. for /f %%a in ('dir /b 2*.txt') do type %%a >$&move $ %%a&goto l
  14. pause
复制代码
命名是成功的!不过我有个疑问!我看运行记录为什么会读取到作者?
>>>>>>2:
运行到最后没有文件了会显示找不到文件!怎么改下
发表于 2011-12-12 13:11:15 | 显示全部楼层
你的问题是n没有被初始化。。。第2个文本进循环后n不是0开始的,所以不输出。

delims不支持 单词 分割。。。

for这种循环会一直循环到文件结束,你只用第一行,这种方式太浪费了。
  1. if not exist out_dir  md out_dir
  2. for /f %%a in ('dir /b 2*.txt') do (
  3.     CALL :SUB_REN %%a
  4. )
  5. pause
  6. exit

  7. :SUB_REN
  8. for /f "delims=《》 tokens=2" %%b in (%1) do (
  9.    move %1 out_dir\%%b.txt
  10.    goto :EOF
  11. )
复制代码
大概写成代码可能能好的。

如果非要2楼的代码能处理第2个文本,请加上

for /f %%a in ('dir /b 2*.txt') do (
   set /a n=0
   for /f "delims=全集 tokens=1" %%b in (%%a) do (

评分

参与人数 1技术 +1 收起 理由
jellyhk + 1 代码很好!不过有错tokens=1

查看全部评分

发表于 2011-12-12 16:16:09 | 显示全部楼层
楼主也是铁杆坛友了,以你的经验,这样的标题和顶楼内容能过关吗...
 楼主| 发表于 2011-12-13 10:24:14 | 显示全部楼层
本帖最后由 jellyhk 于 2011-12-13 10:26 编辑

回复 4# CrLf
呵呵!我的错!我从小语文就很烂!真想不出对的标题!抱歉了
 楼主| 发表于 2011-12-13 10:31:53 | 显示全部楼层
本帖最后由 jellyhk 于 2011-12-13 11:01 编辑
delims不支持 单词 分割。 ...
slore 发表于 2011-12-12 13:11

2楼有新问题!·!帮忙看看

    不支持 单词 分割?就是说这里不能用中文?还是词语?但是怎么能成功呢?
另外你的goto :eof是不是实现了防止阅读完小说的功能呢?
goto :eof是跳到call下面吗?那不是命名一个文件后就到pause那段代码了?
发表于 2011-12-13 11:28:33 | 显示全部楼层
本帖最后由 CrLf 于 2011-12-13 11:43 编辑
  1. @echo off
  2. for /f "tokens=2*delims=:" %%a in ('findstr /n . 2*.txt^|findstr /b 1:') do (
  3.    for /f "tokens=2delims=《》" %%c in ("@%%b") do ren "%%a" "%%c"
  4. )
复制代码
发表于 2011-12-13 11:39:17 | 显示全部楼层
本帖最后由 slore 于 2011-12-13 11:44 编辑

回复 6# jellyhk


    不支持词语,中文支持。
  1. @echo off
  2. for /f "delims=全集 tokens=1" %%i in (t.txt) do (
  3.     echo %%i
  4. )
  5. pause

  6. for /f "delims=「」 tokens=1" %%i in (t.txt) do (
  7.     echo %%i
  8. )
  9. pause
复制代码
测试文本内容
「haha」全集
「abc集123」全集
「123全456」全集
「test」全集


输出结果为
  1. 「ha ha」
  2. 「abc
  3. 「123
  4. 「te st」

  5. ha ha
  6. abc集1 23
  7. 123全456
  8. te st
复制代码
goto 不一样 和 call 标签不一样

为什么会看到作者,因为会读第2行,干嘛加那个=2的判断?直接goto l    ,n也不用算。。。肯定是第一行,进来就处理,然后就goto就行了。
你这个正好move移走文件了,不然就是循环了。。。
你这个dir的次数多。。。用标签把循环拆开的话,dir只用一次。

EOF是文件结尾,其实就是结束下面的 循环,因为是call调用,所以会到for里面,继续第2个文件。
 楼主| 发表于 2011-12-13 11:52:01 | 显示全部楼层
回复 7# CrLf
完全没反映!
 楼主| 发表于 2011-12-13 12:00:41 | 显示全部楼层
回复 8# slore
是哈只处理第一行不用自加!
goto :eof是跳到call下面?又因为call再for里所以运行第2个文件?对吗?
发表于 2011-12-13 12:24:01 | 显示全部楼层
回复 10# jellyhk

发表于 2011-12-13 12:41:15 | 显示全部楼层
回复 10# jellyhk


goto :eof是跳转到文件结尾
具体到你这个例子中,它的作用是介绍本次call调用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 16:03 , Processed in 0.021939 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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