[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

我想利用call的变量延迟特性输出一个带有重定向符号的文本变量,比如call echo %%nihao%% 但是无法成功,于是我想echo一个常量,比如call echo nihao^^> 结果无论如何也无法输出重定向符号。本人菜鸟求帮助,这个问题的起源在于本人用批处理处理网页,发现打开变量延迟会导致网页中的感叹号消失,用call的话网页中的<>标签符号就有问题。不知道批处理里面有没有对整个变量进行强制文本输出的命令

  1. echo "nihao>"
复制代码

TOP

awk 发表于 2011-11-30 09:25



    这样有双引号

TOP

回复 3# xeszero
  1. echo nihao^>
  2. pause
复制代码
http://www.diecasting86.com

TOP

楼上你好。
我说了,一定要call的,我虽然是菜鸟,但转义符号还是懂用的

TOP

如果用call,特殊字符要转义两次
  1. call echo nihao^^^>
复制代码

TOP

如果用call,特殊字符要转义两次
CrLf 发表于 2011-11-30 11:58



    谢谢。但是我把你的代码直接保存为bat文件,运行没有任何显示啊。cmd里面直接运行也是一样无显示

TOP

我碰到这种钉子,转义两次是没错,(如果开通变量延迟,可成功输出!)可call 带转义 > 的不行
或者想法一行里分段输出,或者想法在for里的特定变量输出,还有一思路,管道也可起到延迟的作用即用管道代替call
  1. set "str=nihao^>"
  2. echo %%str%%|findstr .
复制代码

TOP

回复 3# xeszero


能否把你处理网页的BAT代码贴出来看看?

TOP

本帖最后由 601997526 于 2011-11-30 14:46 编辑

8楼的方法似乎不错

TOP

回复 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%% 的方式来进行延迟解释。

TOP

回复 11# CrLf


    多谢指导 !
他这个提问意思是变量要延迟扩展,里面含“!”和“<>”又没提供具体样文和原来处理代码 。既不能用!var!,类似 call echo nihao^^^> (我是碰过钉子,好象执行了一个无显示的命令,什么机理尚不明白)行不通,所以想到用管道延迟扩展... 想兼顾所有特殊字符很麻烦还兼顾效率就力不从心了,好歹用管道能应付过去

TOP

不懂,极少用call,因为绝大多数变量延迟都能用!str!来完成,以前还没注意过这个问题,call 碰到内部命令时无法正确转义特殊字符(<>&|)?

那就用函数吧:
  1. @echo off
  2. call :echo "%%str%%^>"
  3. pause&exit
  4. :echo
  5. echo %~1
复制代码
刚发现另外一个有趣的现象(常用 call 的人也许早就知道了吧):
call echo "^"
的结果是"^^",居然多了一倍的 ^...

TOP

谢谢大家的热心回帖,我把网页和我的批处理发上来大家看看:

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

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

请求各位指点,谢谢

TOP

汗,人呢~~~~~~~~~

TOP

返回列表