标题: [文本处理] 批处理里面的call如何输出带有重定向符号的变量? [打印本页]
作者: xeszero 时间: 2011-11-30 08:43 标题: 批处理里面的call如何输出带有重定向符号的变量?
我想利用call的变量延迟特性输出一个带有重定向符号的文本变量,比如call echo %%nihao%% 但是无法成功,于是我想echo一个常量,比如call echo nihao^^> 结果无论如何也无法输出重定向符号。本人菜鸟求帮助,这个问题的起源在于本人用批处理处理网页,发现打开变量延迟会导致网页中的感叹号消失,用call的话网页中的<>标签符号就有问题。不知道批处理里面有没有对整个变量进行强制文本输出的命令
作者: awk 时间: 2011-11-30 09:25
复制代码
作者: xeszero 时间: 2011-11-30 09:52
awk 发表于 2011-11-30 09:25
这样有双引号
作者: 920168 时间: 2011-11-30 11:40
回复 3# xeszero 复制代码
作者: xeszero 时间: 2011-11-30 11:49
楼上你好。
我说了,一定要call的,我虽然是菜鸟,但转义符号还是懂用的
作者: CrLf 时间: 2011-11-30 11:58
如果用call,特殊字符要转义两次复制代码
作者: xeszero 时间: 2011-11-30 12:38
如果用call,特殊字符要转义两次
CrLf 发表于 2011-11-30 11:58
谢谢。但是我把你的代码直接保存为bat文件,运行没有任何显示啊。cmd里面直接运行也是一样无显示
作者: yyykkkyyyy 时间: 2011-11-30 14:15
我碰到这种钉子,转义两次是没错,(如果开通变量延迟,可成功输出!)可call 带转义 > 的不行
或者想法一行里分段输出,或者想法在for里的特定变量输出,还有一思路,管道也可起到延迟的作用即用管道代替call- set "str=nihao^>"
- echo %%str%%|findstr .
复制代码
作者: awk 时间: 2011-11-30 14:36
回复 3# xeszero
能否把你处理网页的BAT代码贴出来看看?
作者: 601997526 时间: 2011-11-30 14:40
本帖最后由 601997526 于 2011-11-30 14:46 编辑
8楼的方法似乎不错
作者: CrLf 时间: 2011-11-30 16:12
回复 8# yyykkkyyyy
管道中能实现变量延迟的原因是管道为内部命令启用了新的 cmd /c,所以实际执行的是:- %comspec% /s /d /c" echo %%str%%"|findstr .
- ::在批中执行 echo %%cmdcmdline%%|findstr . 即可看到证明
复制代码
类似的还有 for /f:- for /f "delims=" %%a in ('echo %%str%%') do echo %%a
- ::其实质运行的也是 %comspec% /c echo %%str%%
复制代码
cmd /c 虽然也能对输入的参数进行一次额外的预处理,但是毕竟和 call 的二次扩展特性不一样,前者必须启用新进程,后者则不然。
所以相比而言,最常用的还是 !str!,不求效率或者万不得已的情况下也是尽量选择 call echo %%str%%,而非以 cmd /c echo %%str%% 的方式来进行延迟解释。
作者: yyykkkyyyy 时间: 2011-11-30 17:02
回复 11# CrLf
多谢指导 !
他这个提问意思是变量要延迟扩展,里面含“!”和“<>”又没提供具体样文和原来处理代码 。既不能用!var!,类似 call echo nihao^^^> (我是碰过钉子,好象执行了一个无显示的命令,什么机理尚不明白)行不通,所以想到用管道延迟扩展... 想兼顾所有特殊字符很麻烦还兼顾效率就力不从心了,好歹用管道能应付过去
作者: CrLf 时间: 2011-11-30 17:20
不懂,极少用call,因为绝大多数变量延迟都能用!str!来完成,以前还没注意过这个问题,call 碰到内部命令时无法正确转义特殊字符(<>&|)?
那就用函数吧:- @echo off
- call :echo "%%str%%^>"
- pause&exit
- :echo
- echo %~1
复制代码
刚发现另外一个有趣的现象(常用 call 的人也许早就知道了吧):
call echo "^"
的结果是"^^",居然多了一倍的 ^...
作者: xeszero 时间: 2011-11-30 18:58
谢谢大家的热心回帖,我把网页和我的批处理发上来大家看看:
目标是把网页中的< title >标签中夹住的文本替换为 id="info_title" 那行中的那个标题。
我刚学批处理,所以代码特别繁琐,用了一大堆for循环,汗,实际上我就只懂用这个循环。稍微说明一下我的思路,先找到info_title行的真正标题,截取后存入target变量,然后逐行对网页文件判断,如果截取不到title就正常输出到temp.html,如果发现title ,就输出^<title^>!target!^<^/title^>。这样的结果是网页中的感叹号全部消失,由于该网页中有大量注释,感叹号消失后,注释全部显示,整个网页看起来真是难看到极点,都畸形了,汗。
另外,这个转换是面对成千上万个结构相同的网页文件的,所以代码中保留有批量处理的痕迹,比如dir *.html,最后没有重命名html文件而是输出到temp.html是为了调试代码,不要奇怪。
请求各位指点,谢谢
作者: xeszero 时间: 2011-12-3 08:41
汗,人呢~~~~~~~~~
作者: yyykkkyyyy 时间: 2011-12-3 11:28
本帖最后由 yyykkkyyyy 于 2011-12-3 11:40 编辑
你该直接贴部分样文和代码的,高手们不是很感兴趣就懒得下载,还是用管道代call吧,即
echo ^<title^>!target!^<^/title^>....换成- echo ^^^<title^^^>%%target%%^^^</title^^^>|findstr .>>文件名
复制代码
作者: xeszero 时间: 2011-12-4 10:34
回复 16# yyykkkyyyy
多谢!问题已经解决 ,果然 管道也能起到延迟作用。
下次有什么问题看来要直接贴代码在页面上。
再次感谢~
作者: rat 时间: 2011-12-7 10:21
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |