标题: [文本处理] 批处理如何在提取小说名[包含特殊符号]不出错? [打印本页]
作者: jellyhk 时间: 2011-12-18 12:42 标题: 批处理如何在提取小说名[包含特殊符号]不出错?
本帖最后由 jellyhk 于 2011-12-21 12:20 编辑
起因:
今天下小说!改名的时候出错了!测试完发现是小说名里有特殊符号----不能用与文件的名字里的符号:\ / ? * |等等!
文件小说名:
211111.txt
小说内容:
《谁为峰/江湖笑谈录》全集
我的代码运行没特殊符号的能成功!
目的:
当文件内容里有特殊符号一样能命名成功![当然是去掉符号了]
要求:
最好在我的代码基础上改!别另写!另写我会!- for /f "delims=/ tokens=1-2" %%a in (211111.txt) do (set b=%%a%%b)
- ren 211111.txt %b%.txt
复制代码
------------------------------------------------------ setlocal EnableDelayedExpansion
- rar e -o- dzs.qisuu.com\2*.rar 2*.txt
- ::参数e是提取
- ::-o-是不覆盖已经存在的文件
- ::-----------上面是解压出文件,下面是改名---------------------
-
- if not exist 小说提取目录 md 小说提取目录
- :l
- for /f %%a in ('dir /b 2*.txt') do (
- for /f "delims=《》 tokens=1" %%b in (%%a) do (
- move %%a 小说提取目录\%%b.txt
- goto l
- )
- )
- ::-----------下面是把unicode换ANDi
- for /f %%a in ('dir /b 2*.txt') do type %%a >$&move $ %%a&goto l
- pause
复制代码
作者: CrLf 时间: 2011-12-18 16:55
能把特殊字符消掉吗?还是怎么做?
作者: awk 时间: 2011-12-18 18:44
你的代码里面有5个(
但是有6个)
是什么原因?
作者: jellyhk 时间: 2011-12-19 10:27
2L:
是去掉特殊符号!并命名!
3L:
不知道为什么!反正多个)一样能成功!我删除了试了下一样能行!不知道为什么!
作者: jellyhk 时间: 2011-12-20 19:27
我顶!求帮助
作者: awk 时间: 2011-12-20 19:47
回复 4# jellyhk
代码你是自己写的吗?还是从别的地方抄得时候抄错了?
作者: jellyhk 时间: 2011-12-20 20:16
本帖最后由 jellyhk 于 2011-12-20 20:20 编辑
这是自己写的!
每次下完N本小说都用了!没出错!
今天碰到了文本第一行有特殊字符/
所以出错了!不知道怎么处理!
我知道把/去掉代码是 "%a:/=%"
但是不知道怎么带入进去!实战能力还不够!哎!还需要加强!
作者: weichenxiehou 时间: 2011-12-20 20:26
回复 7# jellyhk
请用for /f "usebackq ...." %%i in ("filename") do ...的格式
作者: awk 时间: 2011-12-20 20:47
回复 7# jellyhk
你自己写的,怎么左右括号不一样多呢,谁教你这样写代码的啊?
作者: jellyhk 时间: 2011-12-20 22:01
我还奇怪呢!你说他错他也能运行!
作者: jellyhk 时间: 2011-12-21 11:08
????没人帮助我么?我哭!
作者: awk 时间: 2011-12-21 12:01
回复 11# jellyhk
如果你愿意自己把多余的括号删掉,我可以帮你。
作者: jellyhk 时间: 2011-12-21 12:14
删除了 !后面怎么 搞
作者: weichenxiehou 时间: 2011-12-21 14:08
回复 13# jellyhk
我不是在上面回答了吗?针对有特殊字符的文件名的通用做法就是两端加引号,因为是在for/f中,所以需要用usebackq变换形式,以免与字符串混淆。
作者: CrLf 时间: 2011-12-21 16:01
代码又三个较严重的问题:
1、如超人所说,未考虑到文件名含空格时发生的错误
2、for /f 无法解析 unicode 文本,应该先转ansi,再处理,如:- for %%a in (2*.txt) do (type "%%a">$
- for /f "delims=《》 tokens=1" %%b in ($) do ( ...
复制代码
为避免降低效率,不建议把 type 合并到第二个 for /f 中:- for %%a in (2*.txt) do (
- for /f "delims=《》 tokens=1" %%b in ('type "%%a"') do ( ...
复制代码
3、文件名中不能含有 \ / : * ? " < > | 这几个字符,在 for 中用变量延迟进行替换即可,但 * 无法以变量替换取巧,建议用 for /f "delims=*" 处理之
作者: jellyhk 时间: 2011-12-21 19:17
1:为什么不考虑有空格的文件名!
-----因为我下的小说不可能有这种情况!所以我忽略他!
2:我在想出现 unicode 文本只是少数!如果用- for %%a in (2*.txt) do (type "%%a">$
- for /f "delims=《》 tokens=1" %%b in ($) do ( ...
复制代码
那不是每本都处理?那不也算低效率?
3:3的点,看不懂!能不能举个例子
作者: CrLf 时间: 2011-12-21 22:35
回复 16# jellyhk
for 无法直接解析 unicode 文本,碰到含有 nul 字符的行是会直接结束解析的。所以为了不错漏,在文件格式不确定的情况下是必须转换的,而此处用的 type 是唯一一个能将 unicode 转为 ansi 的内部命令,只要不写成 for /f ... in ('type') do,其实效率并不低。
而替换特殊字符其实就是- for %%a in (\ / : ? ^" ^< ^> ^|) do set str=!str:%%a=!
复制代码
但是因为 * 无法直接替换,所以其实最方便的应该是写成(为简化表达,不考虑对感叹号的兼容性):- set "str=***test\测<试>"
- set tmp=
- for /l %%a in (1 1 10) do (
- for /f tokens^=1*delims^=\/:*?^<^>^|^" %%b in ("!str!") do (
- set tmp=!tmp!%%a
- set str=%%b
- )
- echo !tmp!
- )
复制代码
作者: weichenxiehou 时间: 2011-12-21 23:06
本帖最后由 weichenxiehou 于 2011-12-22 07:05 编辑
回复 16# jellyhk
不好意思,以上几次回答会错题意,楼主如果修改关键一句复制代码
为- move %%a 小说提取目录\"%%b.txt"
复制代码
是不是就可以防止大多数特殊符号的影响呢?另外版主大人考虑到了Unicode字符的影响,真可谓思维缜密,个人建议是不是可以用set/p str=<%%a的形式提取到第一行来免除Unicode字符的干扰。既然楼主执意要在原代码基础上修改,当我多嘴吧~
作者: jellyhk 时间: 2011-12-22 11:15
18楼!
1:你那代码没用!因为是命名!命名不准有17楼的那些符号!
2:其实一开始我用的代码就是set /p 来提取,但用过几次后发现没现在1楼的代码好!因为如果第一行内容是长内容[很长]!就不会成功!我下的小说!出现特殊字符也许是100本里有1本的几率吧!但是有第一行有长内容的几率更大!所以不用set /p
作者: awk 时间: 2011-12-23 00:03
回复 18# weichenxiehou
一行可以有1千多个字符,文件名不允许这么长吧。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |