找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 68196|回复: 17

[文本处理] 批处理里面的call如何输出带有重定向符号的变量?

[复制链接]
发表于 2011-11-30 08:43:46 | 显示全部楼层 |阅读模式
我想利用call的变量延迟特性输出一个带有重定向符号的文本变量,比如call echo %%nihao%% 但是无法成功,于是我想echo一个常量,比如call echo nihao^^> 结果无论如何也无法输出重定向符号。本人菜鸟求帮助,这个问题的起源在于本人用批处理处理网页,发现打开变量延迟会导致网页中的感叹号消失,用call的话网页中的<>标签符号就有问题。不知道批处理里面有没有对整个变量进行强制文本输出的命令
发表于 2011-11-30 09:25:57 | 显示全部楼层
  1. echo "nihao>"
复制代码
 楼主| 发表于 2011-11-30 09:52:44 | 显示全部楼层
awk 发表于 2011-11-30 09:25



    这样有双引号
发表于 2011-11-30 11:40:08 | 显示全部楼层
回复 3# xeszero
  1. echo nihao^>
  2. pause
复制代码
 楼主| 发表于 2011-11-30 11:49:47 | 显示全部楼层
楼上你好。
我说了,一定要call的,我虽然是菜鸟,但转义符号还是懂用的
发表于 2011-11-30 11:58:57 | 显示全部楼层
如果用call,特殊字符要转义两次
  1. call echo nihao^^^>
复制代码
 楼主| 发表于 2011-11-30 12:38:16 | 显示全部楼层
如果用call,特殊字符要转义两次
CrLf 发表于 2011-11-30 11:58



    谢谢。但是我把你的代码直接保存为bat文件,运行没有任何显示啊。cmd里面直接运行也是一样无显示
发表于 2011-11-30 14:15:47 | 显示全部楼层
我碰到这种钉子,转义两次是没错,(如果开通变量延迟,可成功输出!)可call 带转义 > 的不行
或者想法一行里分段输出,或者想法在for里的特定变量输出,还有一思路,管道也可起到延迟的作用即用管道代替call
  1. set "str=nihao^>"
  2. echo %%str%%|findstr .
复制代码
发表于 2011-11-30 14:36:43 | 显示全部楼层
回复 3# xeszero


能否把你处理网页的BAT代码贴出来看看?
发表于 2011-11-30 14:40:50 | 显示全部楼层
本帖最后由 601997526 于 2011-11-30 14:46 编辑

8楼的方法似乎不错
发表于 2011-11-30 16:12:13 | 显示全部楼层
回复 8# yyykkkyyyy


    管道中能实现变量延迟的原因是管道为内部命令启用了新的 cmd /c,所以实际执行的是:
  1. %comspec%  /s /d /c" echo %%str%%"|findstr .
  2. ::在批中执行 echo %%cmdcmdline%%|findstr . 即可看到证明
复制代码
类似的还有 for /f:
  1. for /f "delims=" %%a in ('echo %%str%%') do echo %%a
  2. ::其实质运行的也是 %comspec% /c echo %%str%%
复制代码
cmd /c 虽然也能对输入的参数进行一次额外的预处理,但是毕竟和 call 的二次扩展特性不一样,前者必须启用新进程,后者则不然。
所以相比而言,最常用的还是 !str!,不求效率或者万不得已的情况下也是尽量选择 call echo %%str%%,而非以 cmd /c echo %%str%% 的方式来进行延迟解释。
发表于 2011-11-30 17:02:02 | 显示全部楼层
回复 11# CrLf


    多谢指导 !
他这个提问意思是变量要延迟扩展,里面含“!”和“<>”又没提供具体样文和原来处理代码 。既不能用!var!,类似 call echo nihao^^^> (我是碰过钉子,好象执行了一个无显示的命令,什么机理尚不明白)行不通,所以想到用管道延迟扩展... 想兼顾所有特殊字符很麻烦还兼顾效率就力不从心了,好歹用管道能应付过去
发表于 2011-11-30 17:20:00 | 显示全部楼层
不懂,极少用call,因为绝大多数变量延迟都能用!str!来完成,以前还没注意过这个问题,call 碰到内部命令时无法正确转义特殊字符(<>&|)?

那就用函数吧:
  1. @echo off
  2. call :echo "%%str%%^>"
  3. pause&exit
  4. :echo
  5. echo %~1
复制代码
刚发现另外一个有趣的现象(常用 call 的人也许早就知道了吧):
call echo "^"
的结果是"^^",居然多了一倍的 ^...
 楼主| 发表于 2011-11-30 18:58:34 | 显示全部楼层
谢谢大家的热心回帖,我把网页和我的批处理发上来大家看看:

目标是把网页中的< title >标签中夹住的文本替换为 id="info_title" 那行中的那个标题。

我刚学批处理,所以代码特别繁琐,用了一大堆for循环,汗,实际上我就只懂用这个循环。稍微说明一下我的思路,先找到info_title行的真正标题,截取后存入target变量,然后逐行对网页文件判断,如果截取不到title就正常输出到temp.html,如果发现title ,就输出^<title^>!target!^<^/title^>。这样的结果是网页中的感叹号全部消失,由于该网页中有大量注释,感叹号消失后,注释全部显示,整个网页看起来真是难看到极点,都畸形了,汗。
另外,这个转换是面对成千上万个结构相同的网页文件的,所以代码中保留有批量处理的痕迹,比如dir *.html,最后没有重命名html文件而是输出到temp.html是为了调试代码,不要奇怪。

请求各位指点,谢谢
 楼主| 发表于 2011-12-3 08:41:39 | 显示全部楼层
汗,人呢~~~~~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 11:34 , Processed in 0.013183 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表