@neosapient
VC9, VC11, QT4, QT5, MySQL

Как работать с командной строкой? отправлять команды? получать сообщения?

Здравствуйте.

Хочу автоматизировать отправку команд для компиляции программ из консоли.

Мне надо запустить дочерний процесс, который будет эквивалентен запуску bat-файла с содержимым
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"" x86


и в открывшемся окне выполнить какие-нибудь команды, например
cd c:
nmake
nmake install


В общем, пробую писать данные через пайпы, но мой команды не слышат

#include <stdio.h>
#include <stdlib.h>
void foo(char *path)
{
    std::string cmd_exe = "%comspec% /k \"\"C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\vcvarsall.bat\"\" x86";
    FILE *file = _popen(cmd_exe.data(), "wt");
    if(!file)
        return;
    //
    std::string folder = path;
    std::replace(folder.begin(), folder.end(), '\\', '/');
    std::stringstream cd;
    cd << "cd \"" << folder << "\"";
    fputs(cd.str().data(), file);
    //
    std::stringstream nmake;
    nmake<< "nmake";
    fputs(nmake.str().data(), file);
    _pclose(file);
}


То есть, когда я вызываю _popen(), то в консоли вижу стандартное приглашение к работе "D:\something>".
Но дальше мои команты "cd c:" и "nmake" игнорируются.
Указатель file не нулевой, но pipe не реагирует на мои команды. Возможно я как то не правильно открываю pipe.
  • Вопрос задан
  • 237 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Teermit
Через _popen так нельзя, насколько я знаю
Под POSIX решением было бы использовать pipe() и fork(), но под Windows это, скорее всего, не будет работать
Если вывод команд не важен, можно использовать system("..."), но это не всегда будет работать
Более правильный вариант: запускать CMD через WinAPI посредством CreateProcess, пример есть тут: https://msdn.microsoft.com/ru-ru/library/windows/d...
P.S. C++, вероятно, далеко не самое лучшее решение для этой задачи
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы