[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[ZT]CMD解析命令行参数规则

这里说的解析命令行参数,并不是说类似getopt的解析函数,而是说win平台的命令行参数是按什么规则传入程序的。前两天我写了个命令行的程序,程序对根目录的处理总是有问题。经过跟踪,发现当输入参数是(”D:\”)的时候,实际程序读到的参数是(D:”)。在路径的两端加上引号,是为了让路径名称中出现空格的时候不会作为参数分隔符处理。可是显然最后一个引号被\转移为 ” 了。

求助于MSDN,终于找到了命令行解析的规则,原文链接:http://msdn2.microsoft.com/en-us/library/aa243471.aspx。这里我做一下翻译:
参数用空格或者TAB进行分割。
一个字符串若被两个双引号包含,则即使其中包含空格或TAB字符也会被视为一个参数。被引起来的字符串可以嵌入参数内。
字符串中存在的双引号可以通过前置反斜杠进行转义。
反斜杠会被解释成单个字符,除非后面紧接着一个双引号。
如果偶数个反斜杠后面跟随一个双引号,每对反斜杠放一个反斜杠到参数中,双引号被解释为一个字符串界定符。
如果奇数个反斜杠后面跟随一个双引号,每对反斜杠放一个反斜杠到argv数组中,双引号则被剩下的反斜杠转义放入到argv中,而不会作文字符串界定符。


Parsing C Command-Line Arguments
Microsoft Specific —>

Microsoft C startup code uses the following rules when interpreting arguments given on the operating system command line:

Arguments are delimited by white space, which is either a space or a tab.


A string surrounded by double quotation marks is interpreted as a single argument, regardless of white space contained within. A quoted string can be embedded in an argument. Note that the caret (^) is not recognized as an escape character or delimiter.


A double quotation mark preceded by a backslash, \", is interpreted as a literal double quotation mark (").


Backslashes are interpreted literally, unless they immediately precede a double quotation mark.


If an even number of backslashes is followed by a double quotation mark, then one backslash (\) is placed in the argv array for every pair of backslashes (\\), and the double quotation mark (") is interpreted as a string delimiter.


If an odd number of backslashes is followed by a double quotation mark, then one backslash (\) is placed in the argv array for every pair of backslashes (\\) and the double quotation mark is interpreted as an escape sequence by the remaining backslash, causing a literal double quotation mark (") to be placed in argv.
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

回复 3# GNGW


    错误的猜想。没有这样的说法。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 GNGW 于 2024-3-21 16:59 编辑

回复 1# Batcher


    总结:如果想使用普通字符显示,则需要额外一个字符转义,至从左到右读,读到的第一个\ 或者 ^ 是转义字符,后面跟着的就是要转义的字符,如果多个,就遵循1隔1的理论,第一个为转义,第二个为转义的普通字符,第三个为转义,第四个为转义的普通字符,第五个......这样依次类推。
    猜想:是不是\是cmd 的转义字符?^是batch批处理的转义字符?之前就了解了,虽然都是用一个解释器,但cmd窗口,与batch 批处理 解析机制是不一样的?\ 字符可以是转义字符,和batch 批处理中的^一致,比如在cmd参数中需要\\ ,在batch批处理中需要^^,
吹毛求疵的人,找问题的人,好奇心强的人,动手能力强的人,虚心的人,以及一个简单的研究技术的人。

TOP

这是 C Command-Line Arguments 吧。

CMD的命令行参数解析方式可能有点不同,起码反斜杠一般没有转义作用(除了少数命令比如reg。而wmic还不算,那是wql语法规则)。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表