注册
登录
论坛
搜索
帮助
导航
私人消息 (0)
公共消息 (0)
论坛任务 (0)
系统消息 (0)
好友消息 (0)
帖子消息 (0)
批处理之家
»
BAT教程&资料
» 批处理疑难征解:防空字符的选择
[新手上路]
批处理新手入门导读
[视频教程]
批处理基础视频教程
[视频教程]
VBS基础视频教程
[批处理精品]
批处理版照片整理器
[批处理精品]
纯批处理备份&还原驱动
[批处理精品]
CMD命令50条不能说的秘密
[在线下载]
第三方命令行工具
[在线帮助]
VBScript / JScript 在线参考
返回列表
发帖
namejm
发短消息
加为好友
namejm
(闭关中)
当前离线
批处理代码写手
UID
5
帖子
1348
精华
8
积分
5192
PB
4236
技术
145
捐助
501
阅读权限
254
来自
四川-成都
在线时间
1842 小时
注册时间
2007-10-25
最后登录
2013-6-19
荣誉版主
帖子
1348
积分
5192
技术
145
捐助
501
注册时间
2007-10-25
1
楼
跳转到
»
正序看帖
打印
字体大小:
t
T
发表于 2008-11-2 11:48
|
只看该作者
批处理疑难征解:防空字符的选择
原文地址:
http://www.cn-dos.net/forum/viewthread.php?tid=16327
作者:willsort
发表日期:2005-7-29
To All:
经常编写批处理的人,想必对 "if string1==string2 command arguments"这样的句式耳熟能详。因为 string1/2 可以引用变量,所以有可能出现空值,所以就需要防止 string1/2 为空时 if 语句出现的语法错误。
而我们最常使用的方法就是防空字符,最初防空字符的选择有很多,比如:
if #%1==# goto end
if [%1]==[] goto end
if %1!==! goto end
但是,随着批处理的深入使用,以上的所有防空字符被淘汰了,关键的原因就是他们不能避免当 string1/2 中含有空格时所出现的语法错误,比如下面的语句是语法错误的:
if [%1]==[my project] goto end
此时,成对的双引号似乎成了唯一的选择:
if "%1"=="my project" goto end
然而,它仍然不是最佳的选择,如果 string1/2 中同时出现了引号和空格,那么我们所厌见的语法错误又会见面了:
if "%1"=="my project:"code for oop"" goto oop
接下来,我们该怎么办呢?别问我,我不知道答案!
-------------------------------------我是传说中的分隔线------------------------------------------------------
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
这显然又不是我们所需要的结果,那么我们该怎么办呢?
答案在你们的手里 :-)
收藏
分享
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。
心在天山,身老沧州。
doupip
发短消息
加为好友
doupip
当前离线
UID
17864
帖子
26
精华
0
积分
176
PB
173
技术
1
捐助
0
阅读权限
20
在线时间
34 小时
注册时间
2009-9-28
最后登录
2013-11-26
二级士官
帖子
26
积分
176
技术
1
捐助
0
注册时间
2009-9-28
3
楼
发表于 2010-11-1 16:50
|
只看该作者
这些情况应该算是相当特殊了
TOP
jellyhk
发短消息
加为好友
jellyhk
当前离线
UID
3387
帖子
356
精华
0
积分
2177
PB
2159
技术
6
捐助
0
阅读权限
60
在线时间
80 小时
注册时间
2008-8-4
最后登录
2012-5-26
少校
帖子
356
积分
2177
技术
6
捐助
0
注册时间
2008-8-4
2
楼
发表于 2008-11-3 00:38
|
只看该作者
饿! 为什么我就没发现这些问题呢!
想了下没想出来!期待ing!
本人已死!不用联系!~
要联系下来联系!~~
TOP
返回列表
批处理专区: BAT CMD DOS
BAT求助&讨论
BAT教程&资料
BAT原创&转载
BAT新大陆
BAT转载代码
新手练功
出题挑战
有偿求助
第三方命令行
开源原创工具
iBAT
Take Command
其他脚本区
PowerShell求助&讨论
PowerShell教程&资料
PowerShell原创&转载
VBS求助&讨论
JS / JScript / JavaScript
VBS教程&资料
VBS原创&转载
UNIX/Linux Shell
Python
Perl
网络资源区
电脑技术研讨
精品软件交流
论坛事务区
站务交流
意见反馈
论坛公告
版主申请
交换链接
建站杂谈
活动专区
论坛总版规
[收藏此主题]
[关注此主题的新回复]
[通过 QQ、MSN 分享给朋友]