标题: [特效代码] [已解决]批处理如何保留变量延迟下的叹号? [打印本页]
作者: cjiabing 时间: 2009-6-9 15:51 标题: [已解决]批处理如何保留变量延迟下的叹号?
问个很菜的问题:如何保留变量延迟下的叹号- @echo off
- setlocal EnableDelayedExpansion
- set "var=虽然现在雷电交加,但是我坚持上bathome"
- echo %var%
- echo.
- set "war=!!!"!!"!!!^!!^^^!!!!!!%var%"
- echo !!!!!!!!!!!!%war%——!你看见我了吗,我在最前面啊,我是感叹号!~真是悲哀,没人看见我!~
- echo.
- echo 感叹号!你在哪里呀!在哪里?%war%在这里呀!在这里~!
- echo.
- pause
复制代码
以上代码只能显示最后一个感叹号,前面的感叹号一个都无法显示,用双引号在某种情况下可以,但是我不想结果里出现双引号,除非能进一步消除双引号。endlocal可以取消定义,问题是在我使用的代码里不能endlocal,否则后面的代码无法执行。
请求高手解答!~
——————————————————————————————————————————
问题已经解决,本人答案在下面 8 楼!~谢谢tireless,虽然我还没认真的去看那个帖子,但它激励我去探讨这个问题。
[ 本帖最后由 cjiabing 于 2009-6-11 22:08 编辑 ]
作者: tireless 时间: 2009-6-9 16:12
简析环境变量和变量延迟特殊字符以及中介法的微妙关系
http://www.cn-dos.net/forum/viewthread.php?tid=30884
作者: cjiabing 时间: 2009-6-9 16:42
看了一下,不错,只是看了几天代码现在头疼的很,能不能直接给个答案?
作者: tireless 时间: 2009-6-9 17:09
在没开启变量延迟时设置变量。如:- @echo off
- for /f %%a in (a.txt) do (
- set var=%%a
- setlocal enabledelayedexpansion
- echo !var:1=2!
- endlocal
- )
- pause
复制代码
[ 本帖最后由 tireless 于 2009-6-9 17:10 编辑 ]
作者: cjiabing 时间: 2009-6-9 17:26
bjsh版主 ——这个朋友写得不错,相当厉害,只是没有总结好。
hizebra ——这个朋友倒是总结了一下:
『第 18 楼』: 启用变量延迟后,感叹号如何显示?
诚如楼主所言,启用变量延迟后,双感叹号!!间的内容将被替换,若无定义,则echo为空;
试用了 echo "!!!!" 的语句后,显示双引号"";
再试 echo "^!^!!!" 可以显示 "!!";
再试 echo "!^!^!!" 显示为"!";
试 echo "^!!!^!" 显示为"!";
试 echo "!!^!^!" 显示为"!";
由此得到以下规律:
1、脱字符^在字符串首出现时必可显示一个感叹号,后面继续紧跟^!这样的序列组,有多少组就会得到多少个感叹号,直到连续感叹号出现为止;
2、在第一组连续感叹号和最后一个感叹号间的字符串中,只有出现连续^!两组以上的序列,才会得到一个感叹号,有N组就得到N-1个感叹号;即两个脱字符间的感叹号才可被转义。
3、如果把以上echo语句中的双引号取掉,无论任何情况都得不到输出结果。
尽管得到这样的结论,对其内部处理机制仍不是很清楚,请高手答疑。
另外,即使通过这种方法可以显示!,那么怎么取掉外部的双引号呢?请不要简单告诉我输出文件,再用for解析变换,这样得不偿失。我已经尝试用set定义这些echo内容了,然而显示变量为空,不明就里。
作者: cjiabing 时间: 2009-6-9 17:48
原帖由 tireless 于 2009-6-9 17:09 发表
在没开启变量延迟时设置变量。如:@echo off
for /f %%a in (a.txt) do (
set var=%%a
setlocal enabledelayedexpansion
echo !var:1=2!
endlocal
)
pause
谢谢支持!问题到现在已经解决了一般,已经得到!,只是不知道是中文状态的还是英文状态的,晚点检查再说。其实这里面涉及到一些规律问题,我搞了半天,按照这个规律才得到结果的,稍晚总结一下,谢谢。
作者: someone 时间: 2009-6-9 17:51
echo ^^!
作者: cjiabing 时间: 2009-6-9 23:22 标题: 解决
- @echo off
- setlocal EnableDelayedExpansion
- echo.
- echo 变量延迟中的叹号规则小结
- echo.
- echo 1、变量延迟下的叹号如果是中文状态,它将被当做字符串显示——问问美国人去!~
- echo 2、变量延迟下的叹号如果是英文状态,它将取代正常状态下的百分号 %% 来界定变量。
- echo 3、单个叹号将被直接忽略掉。
- echo 4、紧邻的两个叹号被定义为变量,叹号连同叹号之间的内容将被忽略掉。
- echo 5、P定义两个叹号为一个变量是将从左向右、紧邻、不重叠的一对叹号界定为变量的。
- echo 6、两对变量之间的字符串因为未被定义为变量而当做字符串显示。
- echo 7、取消变量延迟中的叹号作为变量界定需要用转义符 ^ 。
- echo 8、将叹号从变量界定转换为字符串需要用两个转义符 ^^ ^^ 增强(原因?)
- echo 9、变量延迟中的叹号的意义:可以利用此规则取消文档中的英文叹号。
- echo 10、如果需要保留变量延迟中的英文叹号,请参照下面的例子。
- echo.
- echo ^^!
- echo ——直接在叹号前面用两个转义符 ^^^^ ^^^^ 。
- echo.
- echo ^^!手中有粮^^! ^^^^^^^^ ^^! ^^!心中不慌^^!
- echo ——在两对变量叹号中间添加一个带两个转义符的叹号。
- ::实际上是这样写的: echo !手中有粮! ^^! !心中不慌!
- ::中间那个带两个转义符的叹号才能正确显示出来。
- echo.
- echo.
- echo 以上内容直接运行来看即可,后面的内容需要一边运行一边看代码。 下面是试验过程:
- echo.
- pause
- echo.
- echo.
- echo Hello!
- ::这样打出来的叹号会被忽略掉。
- echo !Hello!
- ::这样符号变量延迟的格式要求,没有显示。
- echo !Hello! !Hello! !Hello!
- ::以上同样符号要求,此时的叹号并非用作字符串,而是用作命令界定,没有显示。
- echo !Hello! Tom !Hello! !Hello!
- ::我们在两个延迟变量中间加上一个Tom,结果它把这个Tom显示出来了。
- echo OK? !Hello! Tom !Hello! BeJing !Hello! Nihao
- ::都显示出来了
- echo !Hello! Tom! !BeJing! !Nihao!
- ::在Tom后面加了一个叹号,打乱了原来的规则,显示TomBeJingNihao。
- ::意味着第一对叹号是Hello,被忽略掉了。
- ::第二对是Tom后面,BeJing前面的两个叹号,它们同样被忽略掉了。
- ::第三对是BeJing后面,Nihao前面的两个叹号,它们同样被忽略掉了。
- ::最后一个叹号它并非显示字符串,在变量延迟下同样被忽略掉。
- ::这样,在三队叹号之间的字符串TomBeJingNihao就被显示出来了。
- echo Hello Tom^!
- ::取消字符的命令意义我们通常用 ^ ,而通常一个 ^ 是不够的。
- echo Hello Tom^^!
- ::必须用两个 ^ 才能将叹号转换为可显示的字符串。
- echo Nihao^^! Beijing^^!
- ::虽然存在两个叹号,但叹号已经被成功转义了,所以Beijing并未被忽略掉。
- echo Nihao^! Beijing^!
- ::可见转义符 ^ 在变量延迟里一样有效,不过它需要两个 ^ 来增强而已。
- echo.
- echo.
- echo 下面做练习:请猜猜下面的命令将显示什么?
- echo.
- echo ^^!垃圾,你给我出来^^!
- ::终于正确显示了
- echo.
- pause
- echo.
- echo ^^!SB!你藏里面做什么^^!
- ::只看见SB和它前面的!
- echo.
- pause
- echo.
- echo ^^!上帝^!什么时候我也能彻底隐身^!没人能找到我的!!IP!!就好咯^^!
- ::只有“!上帝没人能找到我的”
- echo.
- pause
- echo.
- echo !昨天!!我在马路边!!捡到!!!一分钱!!!真的吗?!是啊!!不骗你的!!!
- echo.
- pause
复制代码
作者: tiandyoin 时间: 2023-3-24 17:21
回复 8# cjiabing
楼主再总结下,在set 变量替换和 for ... ('findstr !...! ') 里的规则呗!感觉会要几万行
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |