cmd-逗号分隔参数与空间相比?

时间:2010-11-11 16:06:59

标签: c command-line windows-xp cmd

我在这个主题上有一些问题,逗号与空格相比,在界定参数方面。

他们是熟悉cmd提示符的C程序员的问题,可能会对它们有所启发..

我知道在做什么时

c:\>program a b c

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

根据hh ntcmds.chm概念..

Shell概述

; and , are used to separate parameters

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

我看到dir a,bdir a b

的结果相同

c:\>program a,b,c 给出参数[0] =程序[1] = a,b,c

那么做些什么?还是所有? windows命令使用;而且,?并且是在每个命令的代码中解释,还是像shell一样用shell来完成?

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

但DIR /?没有提到它,但可以使用它。并且一个典型的c程序根本不作为分隔符。所以shell不使用逗号分隔,它使用空格。和windows命令一样,这样做是因为它们是(全部?)写的,用来界定shell在使用逗号时进一步给出的参数?

2 个答案:

答案 0 :(得分:4)

Unix和Windows之间存在两个不同之处:

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

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

我从未见过使用,;作为命令行分隔符的C程序。我知道explorer /e,.的特殊情况,但直到现在我才见过dir a,b示例。

答案 1 :(得分: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天。现在你可能应该只使用空格。正如Tim所说,C运行时决定了有关参数的某些内容以及它们应该如何被解析。许多其他语言/框架遵循该惯例,但不一定全部。例如,PowerShell具有完全不同的参数处理,当与其中的本机程序交互时,这有时会令人惊讶(可以说,PowerShell cmdlet和函数不是其他地方可执行的程序,而是同样的批处理文件)。