2013-02-22 2 views
1

из программы 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»

(оспа на человека, что эта мысль, имеющих пробелы в именах путей была хорошая идея.)

(А используя одиночные кавычки не изменяет поведение.)

+0

Попробуйте заменить '' '' '' '' и посмотреть, не работает ли он лучше. –

+0

Я использовал escape-последовательность при построении строки команд. Это не помогло. –

+0

Я думаю, вы смотрите на известную проблему с реализацией библиотеки времени выполнения 'system()' C. Не могли бы вы построить командную строку (включая ведущий 'cmd.exe/c') и использовать CreateProcess? –

ответ

0

Как вы, наверное, знаете, одиночные кавычки для одного символа , а double - для нескольких ... Вы также знаете, что вы не можете содержать двойные кавычки внутри строки или выходить из строки и DDS их (в зависимости от ситуации) ...

Попробуйте сделать следующее и сказать, что происходит:

system("setEnvVars.bat & xCmd.exe -e 'my params with spaces'"); 

system("setEnvVars.bat & xCmd.exe -e \"my params with spaces\""); 
+0

Также убедитесь, что для целей отладки не содержать строку в массиве myCommands (только для тестирования), а также попробовать заменить sub-qoutes на (" '") вместо («), поэтому сделайте это« 'Мои парамы с пробелами» ' – Mitch

1

После ударив мой голова какое-то время, я отказался от «системы (командная_строка)» подход и пошел с вызов «CreateProcess» (это будет работать под Windows).

Использование CreateProcess Мне удалось выполнить боковую задачу по всей переменной окружения, что и побудило меня использовать синтаксис cmd1 & cmd2.

CreateProcess позволит вам передать другую среду дочернему процессу. Я смог выяснить, как переписать среду и передать ее ребенку. Это обстоятельно решило мои проблемы.

Мой код для перезаписи среды может быть немного громоздким, но он работает и кажется довольно надежным.

+0

Не могли бы вы (возможно, упростить) показать нам код, который использует CreateProcess? Достаточно, чтобы мы знали, как его использовать в этом случае. – qqqqq

Смежные вопросы