2010-11-11 152 views
7

我对这个主题,逗号与空格相比,在分隔参数方面有一些问题。cmd-逗号分隔参数相比空间?

他们是熟悉的命令提示符C程序员,也许能扔一些轻的问题..

我知道这样

c:\>program a b c 

时,有4个参数[0]=program[1]=a[2]=b[3]=c

根据hh ntcmds.chm概念..

壳牌概述

; and , are used to separate parameters 

; or , command1 parameter1;parameter2 Use to separate command parameters. 

我看到dir a,b给出相同的结果dir a b

c:\>program a,b,c 给出参数[0] =节目[1] = A,B,C

那么做一些?或所有? Windows命令使用;和?这是在每个命令的代码中进行的解释,还是由shell像空间一样完成的?

如果它是在每个命令的代码..我怎么知道它是哪一个呢? 我注意到explorer.exe的文档提到了逗号,例如。你可以做 explorer /e,.

但是DIR /?没有提到它,但可以使用它。而一个典型的c程序并不需要,作为一个分隔符..所以是这种情况,壳不使用逗号分隔,它使用空间。和windows命令一样,这样做'因为它们是(全部?)写入来限定shell使用逗号时进一步提供的参数吗?

回答

4

有两个不同位置的Unix和Windows之间:

  • 内部命令,如DIR内置在外壳;他们的命令行语法不必遵循与常规程序相同的规则。
  • 在Windows上,程序负责解析其自己的命令行。 Shell解析重定向和管道,然后将其余命令行传递给一个字符串中的程序

使用Visual Studio构建的Windows C程序在Microsoft C运行库中使用命令行解析器,它类似于典型的Unix shell解析器并遵从空格和引号。

我从来没有见过使用,;作为命令行分隔符的C程序。我意识到explorer /e,.的特例,但直到现在我才看到dir a,b的例子。

+0

如何判断shell执行了什么操作,以及MS C运行时或标准库执行了什么操作?我有一个Windows C PROG只是#include 在顶部,以及显示argv的代码。使用gcc编译。我看不到一种方法,我可以看到哪些“参数化!”是从shell完成的,而且是从标准库自动执行的。另外,我注意到逗号不适用于外部程序xcopy或telnet。我想我已经看到了rundll32。我想这只是一些。可能不是一个公共可用库中的函数!也许只是特殊的ext程序,它会执行cmd.exe的内部命令。 – barlop 2010-11-11 16:40:45

+0

除了shell功能,一切都是由MS C运行时完成的。 Shell功能包括重定向('<', '>'等''''),管道('|'),流量控制('&&'和'||')和转义('^')等。 就像我说的,我从来没有见过在命令行上使用'''的程序,所以我并不惊讶复制和telnet不支持它。 – 2010-11-11 17:35:13

+0

你是否建议ms c runtime确实分隔空格和引号?还是仍然是壳?如果它是ms c运行时,你能证明它吗?我没有看到你的第二个要点是如何区分unix,而windows的cos不是unix shell也是解析重定向和管道。 – barlop 2010-11-11 18:00:15

0

批处理文件使用逗号或分号作为备用参数分隔符。

测试批处理文件:

@echo %1/%2/%3 

试运行:

> test.cmd 1,2,3 
1/2/3 
> test.cmd 1;2 3 
1/2/3 

而且,正如你注意,dir使用它,copy以及 - 这些都是shell内置并可能贯穿像批处理文件一样的类似解析器(它不完全相同,因为您可以执行诸如cd..dir/s这些其他任何操作都不可能的操作)。我猜(注意:推测)这是一种向后兼容性,可以回溯到DOS甚至CP/M天。现在你可能应该只使用空格。正如蒂姆指出的那样,C运行时决定了某些关于参数的事情以及它们应该如何解析。许多其他语言/框架遵循该约定,但不一定全部。例如,PowerShell具有完全不同的参数处理方式,当与其中的本地程序进行交互时(有人说,PowerShell cmdlet和函数不是可在其他地方执行的程序,而是同时使用批处理文件),这有时会让人感到意外。

+1

你写道:“PowerShell cmdlet和函数不是可以在其他地方执行的程序,但批处理文件”应该不是不是,而是,删除?像你说的批处理文件,同样,不能从PowerShell运行,所以我不明白为什么有一个'但是'在那里。 – barlop 2013-12-29 15:50:57