前些时间做了一个Windows的命令行程序,由于输入的参数可以含有特殊字符,所以对Windows的Command Prompt切参数规则做了些调查,在此和大家分享一下:)

Windows命令行,参数的转义分为两个步骤: 第一个步骤是cmd解析你输入的字符串决定要启动哪些进程,进程之间是否要标准输入输出重定向等等; 第二个步骤是CRT把传入进程的命令行字符串切成多个参数,填好argc和argv传入main函数。

第一个步骤中,| ^ ” &等字符是特殊字符。如果特殊字符出现在双引号外,需要被转义。但如果出现在双引号中,就不需要也不能被转义。转义时,^^代表^,^|代表|,^”代表”等等。

首先是空格和tab如果不在双引号,就会被当作参数的分隔符,而双引号引住的空格和tab代表空格tab字符本身。

其次是连写双引号的特殊处理。如果想要把双引号作为参数内的字符,那么至少要连写两个双引号:”"。当他遇见连续的两个双引号时,他会把其中一个双引号作为双引号字符,另一个双引号作为引用范围的开始或结束。也就是说,如果你已经在引号中了,连写2个双引号的话,就会产生一个”字符,并且关闭引用。要想产生一个”字符但不改变引用状态,就需要连写三个双引号”"”。

最后是用反斜杠(即\)转义的规则。对于n个反斜杠外加一个双引号会被转义。如果n为奇数,那么会被转义成(n-1)/2个\字符外加一个”字符。如果n为偶数,那么会被转义成n/2个\字符,然后再进入或结束引用范围。而如果反斜杠后面并不跟随双引号,反斜杠就不转义。

例如,你想在命令行下查看目录下的一个名为”|Server”|Config|”的txt文件的内容,那么你就需要在命令行下输入:

type """|Server"""^|Config^|"""

注意,其中某些|必须要转义,而另一些则必须不转义。

还有很多具体我,我依然不是很清楚,希望这些对大家有用。当然,如果有对此很了解的,还请多多指教。

Leave a Reply