中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-01 08:41
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批处理疑难征解:防空字符的选择 查看 2,652 回复 9
楼 主 批处理疑难征解:防空字符的选择 发表于 2005-07-29 22:22 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
To All:

  经常编写批处理的人,想必对 "if string1==string2 command arguments"这样的句式耳熟能详。因为 string1/2 可以引用变量,所以有可能出现空值,所以就需要防止 string1/2 为空时 if 语句出现的语法错误。

  而我们最常使用的方法就是防空字符,最初防空字符的选择有很多,比如:

  if #%1==# goto end
if == goto end
if %1!==! goto end

  但是,随着批处理的深入使用,以上的所有防空字符被淘汰了,关键的原因就是他们不能避免当 string1/2 中含有空格时所出现的语法错误,比如下面的语句是语法错误的:

  if == goto end

  此时,成对的双引号似乎成了唯一的选择:

  if "%1"=="my project" goto end

  然而,它仍然不是最佳的选择,如果 string1/2 中同时出现了引号和空格,那么我们所厌见的语法错误又会见面了:

  if "%1"=="my project:"code for oop"" goto oop

  接下来,我们该怎么办呢?别问我,我不知道答案!

[ Last edited by willsort on 2005-7-29 at 22:23 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2 发表于 2005-08-01 11:28 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
To All:

  另一个与此相关的问题是,路径变量后的防御字符。

  当我们使用环境变量引用一个路径时,一般是直接引用,比如:

  %temp%\_temp.bat

  但这样存在一个问题:如果%temp%是某个驱动器的根目录,比如C:\,那么以上的引用就变成了:
  
  C:\\_temp.bat

  路径中出现了双斜线,这在MS-DOS和Win9x中将会引起语法错误,所以有人采用了在变量后加一个句点的做法,即:

  %temp%.\_temp.bat

  这样的话,如果%temp%为根目录,引用结果就是:C:\.\_temp.bat,如果不是根目录(比如C:\temp),就是C:\temp.\_temp.bat。

  这利用了句点在不同用法中所呈现出的二义性:在前一用法中,它表示当前目录,而根目录下的当前目录自然仍然是根目录;而在后一用法中,它表示目录名中主名与扩展名的分隔符,因为句点后没有实际的扩展名,所以C:\temp.仍然表示的是C:\temp目录。

  但是,这带来了一个新问题:如果路径中出现了相对路径的特殊引用符,该怎么办?比如,如果%temp%是表示当前目录的 . 或者上一级目录的 ..,那么 %temp%.\_temp.bat 的引用就变成了:

  ..\_temp.bat 或者 ...\_temp.bat

  这显然又不是我们所需要的结果,那么我们该怎么办呢?

  答案在你们的手里 :-)

[ Last edited by willsort on 2005-8-1 at 11:34 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
3 发表于 2007-02-16 15:43 ·  中国 重庆 沙坪坝区 联通
初级用户
积分 102
发帖 35
注册 2006-03-16 11:56
20年会员
UID 52168
状态 离线
Originally posted by willsort at 2005-7-29 22:22:
To All:

  经常编写批处理的人,想必对 "if string1==string2 command arguments"这样的句式耳熟能详。因为 string1/2 可以引用变量,所以有可能出现空值,所以就需要防止 string1/2 为空时 if 语句出现的语法错误。

  而我们最常使用的方法就是防空字符,最初防空字符的选择有很多,比如:

  if #%1==# goto end
if == goto end
if %1!==! goto end

  但是,随着批处理的深入使用,以上的所有防空字符被淘汰了,关键的原因就是他们不能避免当 string1/2 中含有空格时所出现的语法错误,比如下面的语句是语法错误的:

  if == goto end

  此时,成对的双引号似乎成了唯一的选择:

  if "%1"=="my project" goto end

  然而,它仍然不是最佳的选择,如果 string1/2 中同时出现了引号和空格,那么我们所厌见的语法错误又会见面了:

  if "%1"=="my project:"code for oop"" goto oop

  接下来,我们该怎么办呢?别问我,我不知道答案!



还好 2K 中的CMD没有此等问题
4 发表于 2007-02-16 23:06 ·  中国 浙江 台州 温岭市 电信
高级用户
★★
DOS学徒
积分 526
发帖 252
注册 2007-02-12 05:35
19年会员
UID 79286
性别 男
状态 离线
willsort就是强
研究的很深了
5 发表于 2007-02-17 00:55 ·  中国 黑龙江 哈尔滨 电信
高级用户
★★★
积分 760
发帖 357
注册 2005-10-10 22:33
20年会员
UID 43332
状态 离线
这是我前几天碰到的问题,没办法只好如此解决,不知道有没有更好的办法了?

:01
ECHO %LA%>%temp%\PD.TXT
TYPE %temp%\PD.TXT|find /i "ECHO is off">NUL
if ERRORLEVEL 1 goto 02
DEL %temp%\PD.TXT
MYSET LA=AAAAA>NUL
:02
.......

[ Last edited by 0451lym on 2007-2-17 at 01:29 AM ]
6 发表于 2007-02-18 23:08 ·  中国 山东 滨州 博兴县 联通
中级用户
积分 204
发帖 44
注册 2003-08-08 00:00
22年会员
UID 8224
性别 男
状态 离线
关于第一个问题,看过XUSEN批处理后可以找到几种处理的办法,一个较好的办法是用批处理的参数办法,因为批处理会把传递来的参数以空格为分界符来分之,用来去掉变量中的空字符倒是个好办法,不过应对判断变量与值是否相等得需要变通一下了

第二个问题有些过于牵强批了,如果非要应用之,难道还得用批处理先检验该变量??或者等谁来做个小程序集成该功能吧
7 发表于 2007-08-23 15:44 ·  中国 江苏 宿迁 电信
初级用户
★★
Batchs上議院參議長
积分 199
发帖 105
注册 2007-06-05 12:00
19年会员
UID 90300
性别 男
来自 江苏
状态 离线
willsort 如果不离开本群的话相信这帖子就不会这么冷清了
『生如夏花之绚烂
死若秋叶之静美』 dos做到了
8 发表于 2007-10-01 00:29 ·  中国 浙江 温州 电信
中级用户
★★
积分 458
发帖 196
注册 2006-10-05 12:04
19年会员
UID 64614
状态 离线
第一个问题:
if ""%1""==""my project:"code for oop""" goto oop
=号两边再各添一对""行吗
9 发表于 2007-10-01 14:08 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by zerocq at 2007-10-1 00:29:
第一个问题:
if ""%1""==""my project:"code for oop""" goto oop
=号两边再各添一对""行吗

测试了一下,也不行貌似。
10 发表于 2009-12-30 15:07 ·  中国 广东 江门 电信
新手上路
积分 3
发帖 2
注册 2009-12-07 18:22
16年会员
UID 156087
性别 男
状态 离线
探讨问题一:
其实我个人做法是这样的,把要防止空的变量在For循环中先做一些处理不就行了?
在用变量的句子里利用For循环一下变量,原理是For循环不回执行空行。所以如果值是空的话,会直接跳出,不回执行需要用到变量的句子。

但问题又来了,就是那样会嵌套很多层,对于阅读和维护不方便
论坛跳转: