我在这个主题上有一些问题,逗号与空格相比,在界定参数方面。
他们是熟悉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,b
与dir a b
但
c:\>program a,b,c
给出参数[0] =程序[1] = a,b,c
那么做些什么?还是所有? windows命令使用;而且,?并且是在每个命令的代码中解释,还是像shell一样用shell来完成?
如果它在每个命令的代码中......我怎么知道它是做什么的?
我注意到explorer.exe的文档提到了逗号,例如。你可以做
explorer /e,.
但DIR /?没有提到它,但可以使用它。并且一个典型的c程序根本不作为分隔符。所以shell不使用逗号分隔,它使用空格。和windows命令一样,这样做是因为它们是(全部?)写的,用来界定shell在使用逗号时进一步给出的参数?
答案 0 :(得分:4)
Unix和Windows之间存在两个不同之处:
DIR
等内部命令内置于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和函数不是其他地方可执行的程序,而是同样的批处理文件)。