из программы C Я пытаюсь построить строку, которая будет использоваться в системном вызове:системного вызова в программе C на Windows,
char myCommands[128];
...
/* packing myCommands string */
..
system(myCommands);
Командная строка для выполнения выглядит следующим образом:
setEnvVars.bat & xCmd.exe ...command-paramters...
Если «... command-parameters ...» не содержит символов кавычек, все хорошо, а утверждения успешны.
Если "... команда-параметры ..." содержит любые кавычки, я получаю эту ошибку:
The filename, directory name, or volume label syntax is incorrect.
Пример:
setEnvVars.bat & xCmd.exe -e "my params with spaces"
Другая странная вещь, если я ставлю myCommands string в файл * .bat дословно, кавычки и все, что работает отлично.
Что такое «система (...)», выполняющая разные?
== OK, Подробнее ==
У меня есть простая программа, которая демонстрирует проблему. Эта версия делает работы:
#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»
(оспа на человека, что эта мысль, имеющих пробелы в именах путей была хорошая идея.)
(А используя одиночные кавычки не изменяет поведение.)
Попробуйте заменить '' '' '' '' и посмотреть, не работает ли он лучше. –
Я использовал escape-последовательность при построении строки команд. Это не помогло. –
Я думаю, вы смотрите на известную проблему с реализацией библиотеки времени выполнения 'system()' C. Не могли бы вы построить командную строку (включая ведущий 'cmd.exe/c') и использовать CreateProcess? –