无忧启动论坛

标题: 如何把每个文件的名字 改成 该文件的第一行字 [打印本页]

作者: wjh6088    时间: 2007-6-20 20:13
标题: 如何把每个文件的名字 改成 该文件的第一行字
目的:改文件名
具体要求:名字改为每个txt文件的第一行
比如说:不见得~1.txt.txt.txt  这个文件的第一行是 不见得--中文幽默王
那就把这个文件改名为 不见得--中文幽默王.txt
难点:主要是特殊字符的问题,空格和引号,搞了好久没完全成功
请教各位高手了
所有文件打包到附件了,全是txt的笑话,也可以看看,全部700多个呢,可是大于400kB了,包里传了140多个
我的代码如下
  1. @echo off
  2. :1
  3. setlocal enabledelayedexpansion
  4. for /f  %%i in ('dir /a-d /b /on') do (
  5. set "wj"="%%i"
  6. call :do
  7. )
  8. :do
  9. for /f   %%a in ("!wj!") do (ren  "%%i" "%%a".txt&&goto :eof)
  10. :end
  11. pause
  12. exit
复制代码

[ 本帖最后由 wjh6088 于 2007-6-20 08:15 PM 编辑 ]

笑话.rar

97 KB, 下载次数: 78, 下载积分: 无忧币 -2


作者: namejm    时间: 2007-6-21 13:09
  如果第一行没有出现不能作为文件名的字符的话,下面的代码应该是可行的。

  1. @echo off
  2. :: 新文件名中,前后空格已经去除,但是,没有去除中间部分的空格
  3. :: 如果第一行内容一分号打头,则提取下一行内容;若下一行还是以分号打头,则继续探测下一行内容;
  4. for %%i in (*.txt) do call :re_name "%%i"
  5. pause
  6. exit

  7. :re_name
  8. for /f "usebackq tokens=*" %%i in (%1) do ren %1 "%%~nxi.txt"&goto :eof
  9. goto :eof
复制代码

  1. @echo off
  2. :: 已经去除新文件名中的所有空格,但是速度较慢。
  3. :: 若第一行以分号打头,照样提取第一行
  4. for %%i in (*.txt) do call :re_name "%%i"
  5. pause
  6. exit

  7. :re_name
  8. for /f "delims=" %%i in ('findstr /n .* %1') do (
  9.     set "str=%%i"
  10.     setlocal enabledelayedexpansion
  11.     set str=!str:*:=!
  12.     set str=!str: =!
  13.     set str=!str: =!
  14.     ren %1 !str!.txt
  15.     endlocal
  16.     goto :eof
  17. )
复制代码

作者: namejm    时间: 2007-6-21 13:11
  你想对特殊字符如何处理?抛弃?置换为空?继续探测下一行?
作者: wjh6088    时间: 2007-6-21 16:37
今天考驾照去了,等了好久,不过通过了,笔试98分:lol :lol
非常感谢namejm的帮助,哈哈
特殊字符的处理不重要了,可以保留,也可以抛弃
等我测试先:)
作者: wjh6088    时间: 2007-6-21 16:41
呵呵,厉害啊,通过了
如果不要“不见得--中文幽默王.txt”中间的那个--呢?
我自己先试试修改看
作者: wjh6088    时间: 2007-6-21 18:53
呵呵,重点在于usebackq这个参数的使用
第二个批处理
修改了一下
可以把--后面的中文幽默王去除了
  1. for %%i in (*.txt) do call :第一种方法re_name "%%i"
  2. pause
  3. exit
  4. :第一种方法re_name
  5. for /f "usebackq  delims=-" %%i in (%1) do ren %1 "%%~nxi.txt"&goto :eof
  6. goto :eof
复制代码

下一步研究把前面几行和后面几行广告删除了

[ 本帖最后由 wjh6088 于 2007-6-21 07:19 PM 编辑 ]
作者: wjh6088    时间: 2007-6-21 19:22
  1. @echo off
  2. :: 已经去除新文件名中的所有空格,但是速度较慢。
  3. :: 若第一行以分号打头,照样提取第一行
  4. for %%i in (*.txt) do call :re_name "%%i"
  5. pause
  6. exit

  7. :re_name
  8. for /f "delims=" %%i in ('findstr /n .* %1') do (
  9.     set "str=%%i"
  10.     setlocal enabledelayedexpansion
  11.     set str=!str:*:=!
  12.     set str=!str: =!
  13.     set str=!str: =!
  14.     ren %1 !str!.txt
  15.     endlocal
  16.     goto :eof
  17. )
复制代码
有空的话能说明一下
    set str=!str:*:=!
    set str=!str: =!
    set str=!str: =!
这3句吗,或者给个相关链接
这个赋值的用法看不懂啊,3q

[ 本帖最后由 wjh6088 于 2007-6-21 07:23 PM 编辑 ]
作者: namejm    时间: 2007-6-21 23:37
  如果你想只提取笑话内容,并且自动重命名的话,可以使用如下代码:
  1. @echo off
  2. :: 为了兼容特殊字符,速度就一个字:慢
  3. :: 不过,还可以忍受
  4. rd /q /s 整理后笑话 2>nul
  5. md 整理后笑话
  6. for %%i in (*.txt) do call :pickup "%%i"
  7. start 整理后笑话
  8. exit

  9. :pickup
  10. set num=0
  11. set flag=
  12. for /f "delims=" %%i in ('findstr /n .* %1') do (
  13.     set "str=%%i"
  14.     call set "str=%%str: =%%"
  15.     call set "str=%%str: =%%"
  16.     call set "str=%%str:*:=%%"
  17.     if not defined flag (
  18.         call set "name=%%str:~0,-7%%"
  19.         set flag=1
  20.     )
  21.     if not defined str (
  22.         set /a num+=1
  23.     ) else (
  24.         setlocal enabledelayedexpansion
  25.         if !num! equ 8 (echo   !str!)>>整理后笑话\!name!.txt
  26.         if !num! gtr 8 goto :eof
  27.         endlocal
  28.     )
  29. )
  30. goto :eof
复制代码
  修改一下代码,每行行首空两格,以方便阅读。

[ 本帖最后由 namejm 于 2007-6-22 01:13 AM 编辑 ]
作者: namejm    时间: 2007-6-21 23:48
原帖由 wjh6088 于 2007-6-21 07:22 PM 发表
有空的话能说明一下
    set str=!str:*:=!
    set str=!str: =!
    set str=!str: =!
这3句吗,或者给个相关链接


  一切尽在 set /? 中。

  实际上,这是个字符串替换语句,原始模型是这样的:set str=%str1:str2=str3% 。这条语句的含义是:把字符串 str1 中的所有字符串 str2 替换成字符串 str3,把替换结果保存在变量 str 中。按照这个解释,后两条语句就容易懂一点:把 str 中所有的半角、全角空格置换为空。第一条就稍微有点不好理解了,它的含义是:把字符串 str 中第一个冒号及其之前的所有字符串置换为空。
作者: wjh6088    时间: 2007-6-22 00:14
再次set/?了一下,貌似是没有这个内容的,我的系统是xp sp2
而且系统自带的东西很多是不知所云的
不如namejm大虾说的通俗易懂啊,哈哈,收藏了

看了好久,大致上看懂了,正文部分是没有空行隔开的,通过统计空行的数目来确认----是否到达正文的内容
这个思路很巧妙啊,今天又长进了

[ 本帖最后由 wjh6088 于 2007-6-22 12:37 AM 编辑 ]
作者: wjh6088    时间: 2007-6-22 00:18
分享其中的一个笑话
马克在机场候机。他叫住经过的一个年轻人:“先生,能请问你现在几点?”
年轻人提着两个沉重的手提箱,戴着一块大大的高科技手表,神气的答到:“当然,哪个国家?”
“你能提供几个国家的时间?”马克有兴趣的问。
“世界上所有的国家!”
“哇,太妙了!”
“那没什么,此表的功能还有全球定位系统、传真、E——MAIL,甚至还能接收电视节目并在它的彩色液晶显示屏上播放!”
“太令人难以相信了!你不介意……不介意把它卖给我吧?什么条件都行!”
“好,我的新鲜感已过去了。如果你真想要……900美元,怎么样?”
马克急不可耐地抽出支票薄,递给年轻人一张900美元的支票。年轻人脱下手表递给马克:“这是你的‘高科技’手表。”然后又递给那两只重箱子,“这是它的电池。”





欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3