[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理如何在提取小说名[包含特殊符号]不出错?

本帖最后由 jellyhk 于 2011-12-21 12:20 编辑

起因:
今天下小说!改名的时候出错了!测试完发现是小说名里有特殊符号----不能用与文件的名字里的符号:\ /  ? * |等等!

文件小说名:
211111.txt

小说内容:
《谁为峰/江湖笑谈录》全集

我的代码运行没特殊符号的能成功!
目的
当文件内容里有特殊符号一样能命名成功![当然是去掉符号了]

要求:
最好在我的代码基础上改!别另写!另写我会!
  1. for /f "delims=/ tokens=1-2" %%a in (211111.txt) do (set b=%%a%%b)
  2. ren 211111.txt %b%.txt
复制代码
-----------------------------------------------------
  1. setlocal EnableDelayedExpansion
  2. rar e -o- dzs.qisuu.com\2*.rar 2*.txt
  3. ::参数e是提取
  4. ::-o-是不覆盖已经存在的文件
  5. ::-----------上面是解压出文件,下面是改名---------------------
  6. if not exist 小说提取目录 md 小说提取目录
  7. :l
  8. for /f %%a in ('dir /b 2*.txt') do (  
  9.    for /f "delims=《》 tokens=1" %%b in (%%a) do (  
  10.    move %%a 小说提取目录\%%b.txt
  11.    goto l
  12. )
  13. )     
  14. ::-----------下面是把unicode换ANDi
  15. for /f %%a in ('dir /b 2*.txt') do type %%a >$&move $ %%a&goto l
  16. pause
复制代码
本人已死!不用联系!~
要联系下来联系!~~

回复 18# weichenxiehou


一行可以有1千多个字符,文件名不允许这么长吧。

TOP

18楼!
1:你那代码没用!因为是命名!命名不准有17楼的那些符号!
2:其实一开始我用的代码就是set /p 来提取,但用过几次后发现没现在1楼的代码好!因为如果第一行内容是长内容[很长]!就不会成功!我下的小说!出现特殊字符也许是100本里有1本的几率吧!但是有第一行有长内容的几率更大!所以不用set /p
本人已死!不用联系!~
要联系下来联系!~~

TOP

本帖最后由 weichenxiehou 于 2011-12-22 07:05 编辑

回复 16# jellyhk
不好意思,以上几次回答会错题意,楼主如果修改关键一句
  1. move %%a 小说提取目录\%%b.txt
复制代码
  1. move %%a 小说提取目录\"%%b.txt"
复制代码
是不是就可以防止大多数特殊符号的影响呢?另外版主大人考虑到了Unicode字符的影响,真可谓思维缜密,个人建议是不是可以用set/p str=<%%a的形式提取到第一行来免除Unicode字符的干扰。既然楼主执意要在原代码基础上修改,当我多嘴吧~
看得多说得多,远比不上写得多。

TOP

回复 16# jellyhk


    for 无法直接解析 unicode 文本,碰到含有 nul 字符的行是会直接结束解析的。所以为了不错漏,在文件格式不确定的情况下是必须转换的,而此处用的 type 是唯一一个能将 unicode 转为 ansi 的内部命令,只要不写成 for /f ... in ('type') do,其实效率并不低。
    而替换特殊字符其实就是
  1. for %%a in (\ / : ? ^" ^< ^> ^|) do set str=!str:%%a=!
复制代码
但是因为 * 无法直接替换,所以其实最方便的应该是写成(为简化表达,不考虑对感叹号的兼容性):
  1. set "str=***test\测<试>"
  2. set tmp=
  3. for /l %%a in (1 1 10) do (
  4.    for /f tokens^=1*delims^=\/:*?^<^>^|^"  %%b in ("!str!") do (
  5.       set tmp=!tmp!%%a
  6.       set str=%%b
  7.    )
  8.    echo !tmp!
  9. )
复制代码
1

评分人数

    • jellyhk: 辛苦了!我还要慢慢理解!技术 + 1

TOP

1:为什么不考虑有空格的文件名!
-----因为我下的小说不可能有这种情况!所以我忽略他!
2:我在想出现 unicode 文本只是少数!如果用
  1. for %%a in (2*.txt) do (type "%%a">$
  2.    for /f "delims=《》 tokens=1" %%b in ($) do ( ...
复制代码
那不是每本都处理?那不也算低效率?
3:3的点,看不懂!能不能举个例子
本人已死!不用联系!~
要联系下来联系!~~

TOP

代码又三个较严重的问题:
1、如超人所说,未考虑到文件名含空格时发生的错误
2、for /f 无法解析 unicode 文本,应该先转ansi,再处理,如:
  1. for %%a in (2*.txt) do (type "%%a">$
  2.    for /f "delims=《》 tokens=1" %%b in ($) do ( ...
复制代码
为避免降低效率,不建议把 type 合并到第二个 for /f 中:
  1. for %%a in (2*.txt) do (
  2.    for /f "delims=《》 tokens=1" %%b in ('type "%%a"') do ( ...
复制代码
3、文件名中不能含有 \ / : * ? " < > | 这几个字符,在 for 中用变量延迟进行替换即可,但 * 无法以变量替换取巧,建议用 for /f "delims=*" 处理之

TOP

回复 13# jellyhk
我不是在上面回答了吗?针对有特殊字符的文件名的通用做法就是两端加引号,因为是在for/f中,所以需要用usebackq变换形式,以免与字符串混淆。
看得多说得多,远比不上写得多。

TOP

删除了 !后面怎么 搞
本人已死!不用联系!~
要联系下来联系!~~

TOP

回复 11# jellyhk


如果你愿意自己把多余的括号删掉,我可以帮你。

TOP

????没人帮助我么?我哭!
本人已死!不用联系!~
要联系下来联系!~~

TOP

我还奇怪呢!你说他错他也能运行!
本人已死!不用联系!~
要联系下来联系!~~

TOP

回复 7# jellyhk


你自己写的,怎么左右括号不一样多呢,谁教你这样写代码的啊?

TOP

回复 7# jellyhk
请用for /f "usebackq ...." %%i in ("filename") do ...的格式
看得多说得多,远比不上写得多。

TOP

本帖最后由 jellyhk 于 2011-12-20 20:20 编辑

这是自己写的!
每次下完N本小说都用了!没出错!
今天碰到了文本第一行有特殊字符/
所以出错了!不知道怎么处理!
我知道把/去掉代码是  "%a:/=%"
但是不知道怎么带入进去!实战能力还不够!哎!还需要加强!
本人已死!不用联系!~
要联系下来联系!~~

TOP

返回列表