【发布时间】:2016-03-30 14:57:56
【问题描述】:
在我看来,Windows cmd.exe 解析参数字符串的方式与 C 编译的 exe 的正常解析方式不同。
为了说明,cmd /C "echo ok" 正确打印“ok”。但是,cmd "/C" "echo ok" 会导致
'"echo ok' is not recognized as an internal or external command,
operable program or batch file.
为了比较,这里有一个 C 程序“CommandArguments.c”,它逐行打印参数:
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < argc; ++i) {
printf("%s\n", argv[i]);
}
}
如果我运行CommandArguments.exe "/C" "echo ok",它会正确打印
CommandArguments.exe
/C
echo ok
我问这个是因为我正在实现一个 API 来包装 CreateProcess。在传递给CreateProcess 之前,我引用并转义了所有输入参数。由于上述问题,它适用于大多数情况,但不适用于 cmd。
那么,我想知道为什么cmd 的行为不同?它的参数解析规则是什么?有没有其他程序也以不同的方式解析参数?
【问题讨论】:
-
不要将“命令参数”(“参数”)与“命令开关”混淆。
-
@Stephan,起初只有参数; switches 和 parameters 的分离主要在后期完成,并且很大程度上取决于应用程序...
-
@aschipfl 开关是告诉命令的东西,做什么,一个参数/参数告诉它,有什么数据。将参数括在 qoutes 中将其保留为数据,将 Switch 括在引号中,将其更改为数据。
-
@Stephan:理论上,引号中的切换被解释为数据是有意义的,但大多数应用程序都不会费心去区分。 (但如果他们愿意,他们可以,这是 Windows 传递整个命令行模型的优点之一。)
标签: c windows command-line cmd command-line-arguments