中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]关于SET [variable=[string]]变量名的限制
作者:
标题: [讨论]关于SET [variable=[string]]变量名的限制 上一主题 | 下一主题
newsuper
新手上路

坚持学习



积分 18
发帖 15
注册 2008-10-18
状态 离线
『楼 主』:  [讨论]关于SET [variable=[string]]变量名的限制

因为是初学者,所以对SET [variable=[string]]的变量名的限制不是很清楚,用set /?查看帮助之后发现有这样一句 :SET 命令不允许变量名含有等号。
    刚开始并没有对这句话注意,做练习的时候发现一个问题,我在命令行解释器测试:
1、C:\Documents and Settings\wang>set var =look
2、C:\Documents and Settings\wang>set name=%var:l=b%
3、C:\Documents and Settings\wang>set name
4、name=%var:l=b%
     当时觉得很奇怪,怎么name 没有被var替换呢?然后又用set var发现:
5、C:\Documents and Settings\wang>set var
6、var =look
    这时候觉得有点问题(因为这时候还没发现问题),然后用 echo %var%发现:
7、C:\Documents and Settings\wang>echo %var%
8、%var%
    突然觉得是var有问题 再用echo %var %
9、C:\Documents and Settings\wang>echo %var %
10、look
   这时候才突然明白了,set var =string跟set var=srting这两句不注意看的时候以为一样的(我今天就犯了这个问题),细看会发现,第一句var 后面比第二句var多了一个空格,这样才导致问题。
    我在第1句里set var =look,这时候是设置var ,而不是var,所以导致第2句name=%var:l=b%后,name的值为=%var:l=b%,我本意是吧look变成book赋给name.
     第5句和第6句里之所以能够用set var看到var 的值,是因为set的另一句帮助:
可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
SET 命令已使用的名称的所有变量的值。例如:
    SET P
会显示所有以字母 P 打头的变量
     这样,因为前面没有注意到空格的问题,所以这里也不是很留意。
   直到7、8两句才感觉到可能是空格的问题,最后发现果然是这个问题。
   因为以前用其他语言编写程序的时候总是习惯在变量名后面加上一个空格,这样便于阅读。但是在dos的set里面,有空格跟没有空格是不一样的两个变量。
   发现这个问题之后,我想到开头说的那句帮助,那么变量名除了=外,其他的特殊符号都可以用了?
   简单测试了一下,发现下面几个问题:
1、变量名里不能使用&,(例如 set po6&9$%^155 =123),使用的话会被认为是两个命令的连接而报错(这只是我的测试,不知道别人是不是)
2、变量名里不能使用成对的引号""(例如 set hha"#%45" rg =456),使用的话也会出错。
3、变量名里如果有^,不会报错,但是会把^过滤掉。
   其他的字符也测试了一点,好像没有什么问题,例如可以设置下面的
  set [{!}~e ge w4%t %] sd  =6
这样变量 [{!}~e ge w4%t %] sd 的值就是6了。
   这样的话,并不是变量名只有=不能用了,而且结尾带空格的变量很容易跟不带空格的同名变量被人混用。
   
    以上只是做练习的时候发现的一些问题,希望高手能给予理论层的解释,谢谢。

2008-10-19 02:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  

set 为变量赋值的时候,出了 set 命令本身和变量名之间的空格外,默认是不忽略空格的,这既是优点也是缺点。

  Quote:
E:\>set         cn dos  =  hey, everybody

E:\>set cn
cn dos  =  hey, everybody  

E:\>echo [%cn dos  %]
[  hey, everybody   ]

E:\>



  Quote:
其他的字符也测试了一点,好像没有什么问题,例如可以设置下面的
  set [{!}~e ge w4%t %] sd  =6
这样变量 [{!}~e ge w4%t %] sd 的值就是6了。

不明白你为什么把变量名设成这个样子,这如同你用其他的语言把变量名设为 lakjsdlfjlsjfhkshfs 一样,毫无意义可言。如果纯粹为了研究一下cmd的“特性”,就另当别论了。

2008-10-19 05:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ashu791
贫困用户





积分 -5
发帖 6
注册 2008-10-19
状态 离线
『第 3 楼』:  

关闭这些默认共享

2008-10-19 06:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
newsuper
新手上路

坚持学习



积分 18
发帖 15
注册 2008-10-18
状态 离线
『第 4 楼』:  

Re lxmxn
    我之所以设置了一个毫无意义的名字是纯粹为了测试到底能不能设置这样的变量名。如果设置set I love my gf=     是不是会有一点点实际意义呢,当然了空格也完全可以去掉,只是随便说说。
   另外,个人认为set 后的变量名不忽略空格是缺点,至于你说的优点能不能解释一下?谢谢。

Re  ashu791
     不明白你说的 “关闭这些默认共享”该怎么理解?

[ Last edited by newsuper on 2008-10-19 at 08:01 ]

2008-10-19 07:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
skuny
初级用户





积分 28
发帖 20
注册 2008-12-4
状态 离线
『第 5 楼』:  

学习了
感谢

2008-12-24 11:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: