批处理脚本高级编程技巧——变量嵌套以及预处理的优先级
http://bbs.bathome.net/thread-6537-1-1.html
预处理、变量延迟、call引出的一些问题
http://bbs.bathome.net/thread-3349-1-1.html
只用一句话能set并输出吗?
http://bbs.bathome.net/thread-1100-1-1.html
批处理常见问题解答
http://bbs.bathome.net/thread-1200-1-1.html
在变量延迟打开的情况下如何输出感叹号
http://bbs.bathome.net/thread-1962-1-1.html- 预处理时对百分号%的一种处理机制
- 原文地址:http://bbs.verybat.org/viewthread.php?tid=10907
-
- 问题来源于我给别人写的一段代码,目的是过滤掉广告信息:
-
- @echo off&setlocal EnableDelayedExpansion
- for /r C:\ebook %%f in (*.txt) do (
- for /f "usebackq delims=" %%i in ("%%f") do (
- set "l=%%i"
- set "l=!l:┌─────────────────────┐=!"
- set "l=!l:│搜刮言情、玄幻小说!欢迎您来推荐小说 │=!"
- set "l=!l:├─────────────────────┤=!"
- set "l=!l:│更多小说下载 │=!"
- set "l=!l:│小说分享阅读,独乐乐不如众乐乐 │=!"
- set "l=!l:┖─────────────────────┘=!"
- echo.!l!>>"%%~nf.new.txt"
- )
- )
- 有一文件C:\ebook\eg.txt内容如下:
- 引用:
- ……
- 师太,你竟敢跟贫道抢秃驴!
- (end)
- ┌─────────────────────┐
- │搜刮言情、玄幻小说!欢迎您来推荐小说 │
- ├─────────────────────┤
- │更多小说下载 │
- ├─────────────────────┤
- │小说分享阅读,独乐乐不如众乐乐 │
- ┖─────────────────────┘
- 结果输出为
- 引用:
- ……
- 师太,你竟敢跟贫道抢秃驴!
- (end)
- │搜刮言情、玄幻小说!欢迎您来推荐小说 │=
- ├─────────────────────┤=
- │更多小说下载 │=
- │小说分享阅读,独乐乐不如众乐乐 │=
- │更多小说下载 │=
- ┖─────────────────────┘=
- 问题大致是:上一行被替换成下一行内容,且后面多了“=”。并没有达到预想的目的。
- 仔细思考一下可以找到原因:
- 以l=┌─────────────────────┐为例,经过第一次替换,变量l被清空(实际上变量名被取消定义,可以用if defined l检测◎)。
- 现在问题来了:在第二次替换时,即set "l=!l:│搜刮言情、玄幻小说!欢迎您来推荐小说 │=!",既然l已经不是变量,就应该被当作普通字符,而在预处理时,特殊字符!被消去,那么此时l的值应该为l:│搜刮言情、玄幻小说!欢迎您来推荐小说 │=,但l:为何不见了呢?
-
- 先看分析时用到的一个例子:
-
- @echo off
- set aaa=10
- echo %aaa:~1
- echo %aaa~1
- echo.
- echo %bbb:~1
- echo %bbb~1
- set aaa=
- echo.
- echo %aaa:~1
- echo %aaa~1
- echo.
- set bbb=20
- echo %bbb:~1
- echo %bbb~1
- pause
- 运行结果为
- 引用:
- aaa:~1
- aaa~1
-
- ~1
- bbb~1
-
- ~1
- aaa~1
-
- bbb:~1
- bbb~1
- 请按任意键继续. . .
- 看出什么不同了吗?
- 开始设置aaa为变量,而未设bbb,结果echo %aaa:~1的输出为aaa:~1,而echo %bbb:~1的输出为~1,字符“bbb:”直接被消去。接着取消变量aaa,结果echo %aaa:~1的输出也变成~1,字符“aaa:”也直接被消去。再接着设bbb为变量,结果echo %bbb:~1的输出变成bbb:~1,字符“bbb:”又回来了。而不管aaa、bbb是否为变量,%aaa~1、%bbb~1的输出不变。
-
- 从中可以看出预处理时对百分号%的一种处理机制:首先是百分号%被消去①,然后看%后面的字符之后有无冒号“:”,如果没有,%后面的字符被保留。如果有冒号“:”,则看%与冒号“:”之间的字符是否为已经定义的变量名,如果是变量名,则此变量名与冒号“:”都会被保留;如果不是,则%与冒号“:”之间的字符包括冒号“:”都被消去,只保留冒号“:”之后的字符。
- 在开启变量延迟的情况下,是用!代替%,预处理时对其处理方式与%相同。
-
- 知道这个处理机制后,就不难解释文章开关提到的问题了。
复制代码
|