Board logo

标题: 请问下关于set延迟变量的 [打印本页]

作者: xue2ye     时间: 2006-11-13 08:53    标题: 请问下关于set延迟变量的

不好意思 ,也许是我太笨了,我看遍了论坛里关于这方面的 还是没懂。
@echo off

    echo 去掉引号:
    call :replace 1.txt "

    echo.
    echo 替换字符:
    call :replace 1.txt "谢谢您" "感谢您"

    pause>nul
goto :eof

:replace
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1* delims=" %%i in (%1) do set var=%%i & echo !var:%2=%3!
    endlocal
goto :eo
象这个批处理,我怎么都弄不明白什么意思。。尤其是for /f "tokens=1* delims=" %%i in (%1) do set var=%%i & echo !var:%2=%3!
里!var:%2=%3! 这句话的意思。。其他一关于 ! 的问题我就看不懂。哪位给我指点一下呀。结合上面那个例子讲最好了。set 命令 我看 自带的帮助都那个 一元运算符不知道是什么意思。。。谢谢啊。。
作者: lxmxn     时间: 2006-11-13 09:31

  在论坛里搜索一下吧。关键字:"变量延迟"。

作者: xue2ye     时间: 2006-11-13 09:49
搜过了就是看不懂。。不好意思哈。笨了点。
作者: lxmxn     时间: 2006-11-13 10:16

  Re  xue2ye:

  简单的给你讲一下吧:

  因为命令解释器(%comspec%)在执行for命令时,首先将for命令里的变量扩展为变量的值,所以,当我们执行时,有的变量是根据for命令得到的,这样,变量还没有被定义就被命令解释器给解释(扩展)了,显然是得不到我们想要的,如果要for命令执行之后再扩展变量的值,那么就要启用变量延迟功能来达到这个目的。要启用变量延迟功能,必须在for命令之前首先定义它,用"setlocal ENABLEDELAYEDEXPANSION"就可以开启变量延迟功能。当再次引用变量时,就要用两个"!"将变量包含起来(比如"!var!"),以扩展变量的为其值。

  时间关系,讲解得不是很详细,你可以在论坛里面搜索更多的关于变量延迟的详细说明的。

作者: xue2ye     时间: 2006-11-13 11:33
for /f "tokens=1* delims=" %%i in (%1) do set var=%%i & echo !var:%2=%3!
主要是这句不懂。这句能解释下吗 他这个 !var:“感谢您”=“谢谢您”!  实在想不出来
作者: lxmxn     时间: 2006-11-13 11:43

   !var:“感谢您”=“谢谢您”!——讲变量var里面所有的"感谢您"换成"谢谢您"!  

作者: xue2ye     时间: 2006-11-15 06:46
不好意思,还是没理解。。为什么要用感谢您和谢谢您呢。我换了别的好象就不行了。我看了论坛里大部分关于set的 好象都是只讲了原理,没讲具体用法。能讲讲吗。
作者: ccwan     时间: 2006-11-15 07:06
有些东西确实很抽象,不举个例子大多数人是不明白的。请各位版主、高手在解答问题时尽量加入一些例子,便于理解。谢谢
作者: redtek     时间: 2006-11-15 07:42
这里有一个关于SET的详细应用实例和一些相关的基础内容的资料~:)
你需要的例子里面全有,请从头到尾照着里面的代码全做一遍~:)

简单索引关于SET变量、延时变量、各种符号的用法……
[url]http://www.cn-dos.net/forum/viewthread.php?tid=24549&page=1&sid=688Nn2#pid149853[url]

[ Last edited by redtek on 2006-11-15 at 07:43 AM ]
作者: xue2ye     时间: 2006-11-15 07:49
我就是看不懂啊。跟着做会自己做就不会了。。你给我举个简单的例子哇。。。谢谢啊
作者: 3742668     时间: 2006-11-15 07:51
从代码格式上看似乎是我写的,不过现在看来代码实在是很不成熟的。
至于"为什么要用感谢您和谢谢您",那就要结合 1.txt 的内容来看了,因为参数%1是1.txt。
建议初学者不要把参数与变量混在一起研究,先一句句set地弄明白了再结合其它的。
@echo off
    set str=www.cn-dos.net
    echo 替换前变量str的内容为: %str%
    echo 执行set str=%%str:www=bbs%%
    echo 替换后变量str的内容为: %str:www=bbs%
pause

作者: xue2ye     时间: 2006-11-15 08:33
set str=%%str:www=bbs%%这句什么意思??
作者: zh159     时间: 2006-11-15 09:47


  Quote:
Originally posted by xue2ye at 2006-11-14 20:33:
set str=%%str:www=bbs%%这句什么意思??

这句是显示给你看的,要显示一个%,得%%才行
执行“echo set str=%%str:www=bbs%%”后显示为:set str=%str:www=bbs%


将“www.cn-dos.net”指派给变量“str”,再用%str:www=bbs%将“www.cn-dos.net”里的“www”替换为“bbs”
作者: dshh98     时间: 2006-11-15 13:09
偶也还没看懂``` 555555555
作者: ccwan     时间: 2006-11-15 21:23
学习不要求新奇,要从基本的东西开始。建议dshh98先把dos基本命令仔细看看,多多实践,再探讨高深的东西。
作者: redtek     时间: 2006-11-15 21:41
没看懂是因为: 试图一上来就从含有(变量赋值、变量内容替换、变量显示、如何显示特殊符号)等混合内容的命令串读起:)

) 变量赋值:    set str=www.cn-dos.net

) 变量内容替换:  %str:www=bbs%

) 变量显示:    echo 执行set str=%%str:www=bbs%%
                   (%%代表显示%号本身)

) 显示特殊符号:  echo 执行set str=%%str:www=bbs%%
           %%双百分号代表显示%本身(与值与处理无关),显示结果为:执行set str=%str:www=bbs%

) ……

下面代码很简单 (之所以称做简单是因为:  如果基础知识都学过了,就是很简单)
下面代码也比较难(之所以称作比较难是因为: 如果基础知识不看,上来看就象看程序一样的读,势必总有读不懂的地方)
@echo off
    set str=www.cn-dos.net
    echo 替换前变量str的内容为: %str%
    echo 执行set str=%%str:www=bbs%%
    echo 替换后变量str的内容为: %str:www=bbs%
pause
建议dshh98、xue2ye兄先从基础知识学起,会越来越得心应手的~:)

批处理和类似C语言或是VB的学习点不同:
-----------------------------------
) C与VB等都有函数库(函数)可以调用,无论是文件操作还是字符串提取、打印等都有专门的函数库可选。

) 而批处理就是命令的集和。无论是DOS命令或是Windows的CMD Shell还是调用系统或第三方提供的应用程序等……

  它之所以称之为“批处理”,是因为你把那些想要调用运行的命令和赋值等操作统一的使用“成批处理”的方式运行~:)

) “批处理”没有提供给你象API还是函数库的调用解决之道,系统(DOS或是Windows)给你提供内部、外部命令或应用程序有什么就可以调用什么。
 
  例如:DIR是系统的内部命令,但DIR有很多的参数……(它不是批处理提供的)

  以个人理解不标准的非官方的解释就是:批处理就是命令的集和,把很多命令或是程序集中在一个脚本写成的文件里统一运行。

) 所以,C或VB的学习点是语法、函数库、API……

) 批处理学习点:你对操作系统提供的内部命令或是外部命令或是第三方应用程序理解有多深,用的就有多深。

  (举例:) REG.EXE (CMD Shell),它对注册表操作。
        REG有很多执行参数可以选择,批处理应用它只不过是调用了它的某个参数,
        放到批处理里集中和别的指令一块运行而已。

  (举例:) Format 格式化的命令,也有很多参数,可以直接运行,也可以放到批处理这个脚本文件里调用它执行。

  所以,批处理里要想用的得心应手(举例:象版主那样想怎么做就能怎么做),
  就必须将变量的赋值、变量内容替换、特殊符号、转义(脱逸符)等基础知识要学透:)

  而这些基础知识学得有多深、理解的有多透,就意味着你怎么的得心应手的完成意愿~:)

) 如果象学编程一样(象现代教学法:高速什么24小时速成,什么从入门到精通之类的学习方法),根本行不通:)
  到头来还得回过来从新学习这些基础知识:)

) 建议从基础学起。(批处理还就靠这些基础,没这些基础寸步难行)


==========================================

(举一个实例)

  《如何判断变量的长度?》

  如果使用批处理来计算变量(一个存有字符串的变量)内含有字符串的长度,
系统并没有给你直接提供象C或VB计算字串长度的函数,
这个时候,算法和平日积蓄起来的大量处理变量的经验就告诉了你:
应该使用循环单个变量和累加计数等不同的方式来巧妙达到以上功能~:)

(详细实例见下面地址:)
http://www.cn-dos.net/forum/viewthread.php?tid=24745&fpage=1

而这些并不难,它应用的还是变量赋值、循环、累加(也是变量赋值)、延时变量……的基础知识,
所以,离开了基础知识将寸步难行~:)

--------------------------------
所以,学批处理不从基础知识开始学起等于白学~:)


 

[ Last edited by redtek on 2006-11-15 at 09:57 PM ]
作者: xue2ye     时间: 2006-11-16 08:06
真是谢谢各位大大啊,我终于学会了。呵呵。。 以前也玩bat ,不过一般都是从做些基础的。能实现的不多。现在终于可以有所提高了。谢谢。cn-dos 。谢谢各位。
作者: zh159     时间: 2006-11-16 10:50
set str=%str:www=bbs% 将“www.cn-dos.net”替换为“bbs.cn-dos.net”
作者: scriptor     时间: 2007-1-13 10:58
又知道了一点

解决了我的问题
作者: stormback     时间: 2007-1-19 05:06
不懂啊
作者: jianyaogao     时间: 2007-3-17 21:53
good for me
作者: jianyaogao     时间: 2007-3-18 00:32
详细
作者: godicozy     时间: 2007-3-18 04:50
谢谢搂住的 分享
作者: moniuming     时间: 2007-12-23 20:39
很详细具体,太感谢了!
作者: dai13910     时间: 2008-1-11 15:00
redtek
  好有耐心! 榜样~!
作者: slw218856     时间: 2008-8-20 20:46
期待更详细的