在C程序中,我正在尝试构建一个将在系统调用中使用的字符串:
char myCommands[128];
...
/* packing myCommands string */
..
system(myCommands);
要执行的命令字符串如下所示:
setEnvVars.bat & xCmd.exe ...command-paramters...
如果“... command-parameters ...”不包含任何引号字符,则一切正常并且语句成功。
如果“... command-parameters ...”包含任何引号字符,我会收到此错误:
The filename, directory name, or volume label syntax is incorrect.
示例:
setEnvVars.bat & xCmd.exe -e "my params with spaces"
另一件奇怪的事情,如果我将myCommands字符串逐字地放入* .bat文件中,引用并且它完全正常工作。
什么是“系统(...)”做不同的事情?
==好的,更多详情==
我有一个简单的程序来演示这个问题。此版本可以工作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char cmdStr[1024];
strcpy(cmdStr, "\"C:\\Windows\\system32\\cmd.exe\" /c echo nospaces & C:\\Windows\\system32\\cmd.exe /c echo moretext");
printf("%s\n", cmdStr);
system(cmdStr);
}
输出:
"C:\Windows\system32\cmd.exe" /c echo nospaces & C:\Windows\system32\cmd.exe /c echo moretext
nospaces
moretext
不有效:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char cmdStr[1024];
strcpy(cmdStr, "\"C:\\Windows\\system32\\cmd.exe\" /c echo nospaces & \"C:\\Windows\\system32\\cmd.exe\" /c echo moretext");
printf("%s\n", cmdStr);
system(cmdStr);
}
输出:
"C:\Windows\system32\cmd.exe" /c echo nospaces & "C:\Windows\system32\cmd.exe\" /c echo moretext
The filename, directory name, or volume label syntax is incorrect.
我认为它可能与“cmd.exe / S”选项有关,但尝试引入该选项并不会改变行为。
不需要cmd.exe路径周围的引号,因为没有空间,但在我的目标程序中,我试图允许所有安装路径,其中可能包含“C:\ Program Files”
(那个认为在路径名中有空格的人是一个好主意。)
(使用单引号不会改变行为。)
答案 0 :(得分:1)
在敲了一会儿之后,我放弃了“system(cmdLine)”方法并进行了“CreateProcess”调用(这将在Windows下运行)。
使用CreateProcess我能够解决整个环境变量问题,这导致我尝试使用“cmd1&amp; cmd2”语法。
CreateProcess允许您将不同的环境传递给子进程。我能够弄清楚如何重写环境并将其传递给孩子。这整齐地解决了我的问题。
我重写环境的代码可能有点麻烦,但它起作用并且看起来相当健壮。
答案 1 :(得分:0)
您可能知道,单引号用于一个字符,double用于多个...您还知道您不能在字符串中包含双引号,或者它退出字符串并添加它们(取决于具体情况) )...
尝试以下操作并说明会发生什么:
system("setEnvVars.bat & xCmd.exe -e 'my params with spaces'");
system("setEnvVars.bat & xCmd.exe -e \"my params with spaces\"");