中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-11 00:07
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » [讨论]关于SET [variable=[string]]变量名的限制
可打印版本  2,245 / 4
第1楼 newsuper 发表于 2008-10-19 02:04
新手上路 发帖 15 积分 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了。
这样的话,并不是变量名只有=不能用了,而且结尾带空格的变量很容易跟不带空格的同名变量被人混用。

以上只是做练习的时候发现的一些问题,希望高手能给予理论层的解释,谢谢。
第2楼 lxmxn 发表于 2008-10-19 05:01
版主 发帖 4,938 积分 11,386
set 为变量赋值的时候,出了 set 命令本身和变量名之间的空格外,默认是不忽略空格的,这既是优点也是缺点。

E:\>set cn dos = hey, everybody

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

E:\>echo


E:\>


其他的字符也测试了一点,好像没有什么问题,例如可以设置下面的
set sd =6
这样变量 sd 的值就是6了。


不明白你为什么把变量名设成这个样子,这如同你用其他的语言把变量名设为 lakjsdlfjlsjfhkshfs 一样,毫无意义可言。如果纯粹为了研究一下cmd的“特性”,就另当别论了。
第3楼 ashu791 发表于 2008-10-19 06:41
贫困用户 发帖 6 积分 -5
关闭这些默认共享
第4楼 newsuper 发表于 2008-10-19 07:56
新手上路 发帖 15 积分 18
Re lxmxn
我之所以设置了一个毫无意义的名字是纯粹为了测试到底能不能设置这样的变量名。如果设置set I love my gf= 是不是会有一点点实际意义呢,当然了空格也完全可以去掉,只是随便说说。
另外,个人认为set 后的变量名不忽略空格是缺点,至于你说的优点能不能解释一下?谢谢。

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

[ Last edited by newsuper on 2008-10-19 at 08:01 ]
第5楼 skuny 发表于 2008-12-24 11:16
初级用户 发帖 20 积分 28
学习了
感谢
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023