首页 电脑 电脑学堂 查看内容

命令行参数的探索

2009-7-30 10:01 546 0

摘要: 编写console程序的时候,当给命令行输入参数为『"c:d ef"』的时候,传递到程序的字符串却是『c:d ef"』。为什么会这样呢? 一般上,我们都知道,使用console命令的时候,...
关键词: 引号 参数 转义 时候 功能 一个 程序 空格 bccc 字符

编写console程序的时候,当给命令行输入参数为『"c:\d e\f\"』的时候,传递到程序的字符串却是『c:\d e\f"』。为什么会这样呢? 一般上,我们都知道,使用console命令的时候,每个参数是以空格相隔的。当参数中包含空格的时候,该参数必须要包含在双引号内,参数传递给程序的时候自动脱去双引号。所以,当我要把C盘上的『\d e\f\』目录传递给程序的时候,我使用了双引号。然而却得不到我想要的路径。然而,当我使用『"c:\d e\f\\"』为参数的时候,我得到了我想要的。 原因应当可以从双引号的特殊功能追溯而起,双引号是用来标示参数的开始和结束的。如果参数中需要用双引号本身的字符,微软提供了置换的方法,那就是使用『\"』代替参数中的『"』。 但是提供了这种方法之后,并不因此就一劳永逸,当我们需要在双引号包含的参数的最后一个字符中使用『\』的时候该如何呢?微软又做了一项规定,当『\』后面连接双引号的时候,『\』对『\』起转义的作用,也就是,每两个『\』将变成一个『\』,值得注意的是,这种转义仅当『\』后紧连双引号的时候发生。所以,我使用『"c:\d e\f\\"』的时候,得到的正式我想要的『c:\d e\f\』。 其实除此以外,还有别的办法来表示这个参数,经测试,当参数是最后一个参数的时候,使用『"c:\d e\f\』也 OK。这里有一条不成文的规定,当参数前面使用了标识开始的双引号时,参数字符串将一直延伸,直到找到下一个双引号为止,而且双引号后面必须为空格或者它是最后一个字符。如果结束的双引号不出现,则开始双引号之后的整个命令行都被当作一个参数。 而,如果双引号后面不是空格,而且又不是最后一个字符,那么该双引号将会被省略。 这就是整个探索的过程,总结一下,就是以下几条规律。 1、双引号本身有取消空格解析参数的功能,当参数(开始或者中间)中出现引号的时候表示开始启用这种功能,直到找到下一个双引号为止,该功能结束。 2、要表示字符『"』的时候,需要在前面加上『\』。 3、后面紧连『"』的『\』组,每两个表示一个『\』,该规定的发明,是用来在某种情况下取消『\』对『"』的转义作用。 4、在双引号功能启动之后,成对双引号,可以表示一个双引号,但是很容易造成混乱。 【附】:关于第四点,做了一个有趣的实验:1、当输入『"bccc"v a』的时候,程序得到两个参数,『bcccv』和『a』,第二个双引号起到了关闭的功能。2、当输入『"bccc""v a』的时候,程序得到两个参数,『bccc"v』和『a』,第二个双引号起到了关闭的功能并且起到了把后面的双引号转义成字符的作用。第三个双引号被转义之后,就失去原来的功能了。 3、当输入『"bccc"""v a』的时候,程序得到一个参数,『bccc"v a』,第二个双引号起到了关闭的功能并且起到了把后面的双引号转义成字符的作用。第三个双引号被转义之后失去功能。第四个双引号起到了开启的功能,所以后面虽然有空格,但是仍然被当成一个参数。4、当输入『"bccc""""v a』的时候,程序得到两个参数,『bccc"v』和『a』,第二个双引号起到了关闭和转义的功能。第四个双引号起到开启的功能,但是第五个双引号又把它关上。5、当输入『"bccc"""""v a』的时候,程序得到两个参数,『bccc""v』和『a』,第二个双引号起到了关闭和转义的功能。第四个双引号开启功能,第五个关闭和转义。6、当输入『"bccc""""""v a』的时候,程序得到一个参数,『bccc""v a』,第二个双引号起到了关闭和转义的功能。第四个双引号起到了开启的功能,第五个关闭和转义。第七个又开启了功能,所以最终是一个参数。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部