Board logo

标题: 批处理疑难征解:防空字符的选择 [打印本页]

作者: namejm    时间: 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

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

  答案在你们的手里 :-)
作者: jellyhk    时间: 2008-11-3 00:38

饿!  为什么我就没发现这些问题呢!
想了下没想出来!期待ing!
作者: doupip    时间: 2010-11-1 16:50

这些情况应该算是相当特殊了




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2