QProcess и аргумент командной строки /c

У меня очень странная проблема с QProcess и его странное поведение.

В конце я хочу получить что-то вроде этого (это cmd.exe в Windows 7)

C:\path_to_somewhere>cmd /c "C:\Program Files\path_to_dir\executable"

(cmd для совместимости с показом QProcess)

Итак, чтобы сделать что-то подобное, я создаю это:

QProcess proc;
QString command;
QStringList attributes;

command = "c:\\windows\\system32\\cmd.exe";
QStringList << QString("/c \"C:\\Program Files\\path_to-dir\\executable"");
proc.start(command, attributes);

Что я получаю при выводе ошибки:

Name '\"c:\Program Files\Quantum GIS Wroclaw\bin\gdalwarp.exe\"' is not recognized as
internat or external command, executable or batch file.

(это переведено мной с польского, поэтому на английском может немного отличаться).

Похоже, что символ \ не экранирован в строке, оставляя \" как символы в команде. Что я делаю неправильно?

я пробовал

proces.start(QString) 

с тройкой \"\"\" и она тоже не работает. Я полагаю, что решение этой проблемы должно быть настолько простым, что я даже не думаю об этом.


person silverado    schedule 07.10.2012    source источник


Ответы (2)


Как вы уже заметили, Qt заключает аргументы, содержащие пробелы, в кавычки, что означает, что реальная команда, выданная QProcess, будет выглядеть примерно так (не уверен насчет внутренних кавычек):

c:\windows\system32\cmd.exe "/c \"C:\Program Files\path_to_dir\executable\""

это не то, что вы хотите: вся строка передается в cmd, включая /c. Поскольку /c и путь — это два аргумента, вы должны передать их отдельно в QProcess, не беспокоясь о пробелах, так как они будут обработаны автоматически:

QString command = "cmd.exe";
QStringList arguments = 
    QStringList() << "/c" << "C:\\Program Files\\path_to_dir\\executable";
// note there are two arguments now, and the path is not enclosed in quotes
proc.start(command, arguments);
person Luc Touraille    schedule 18.01.2013

ОК, я не знаю, является ли это ошибкой Qt, но в документации о void QProcess::start(QString, QStringList, OpenMode) говорится примерно так:

Windows: аргументы, содержащие пробелы, заключаются в кавычки.

Похоже, это неправда, так как моя программа использует путь с пробелом, и там разрывается оболочка cmd.

Но я обнаружил функцию, предназначенную для систем, которые принимают аргументы только из одной строки (как это делает Windows).

Это QProcess::setNativeArguments(QString)

который принимает в качестве аргумента одну строку QString, созданную специально для Windows и Symbian.

Так что, в конце концов, если у кого-то есть проблема с передачей аргументов в Windows (или Symbian) в систему, ему следует попробовать setNativeArguments(QString).

person silverado    schedule 07.10.2012