winapi — Как мне получить вывод команды в C ++?

Как получить выходные данные подпроцесса и назначить его переменной. EG: назначить вывод wmic csproduct get uuid возвращает длинную строку символов в CMD, как бы я выполнил эту команду в C ++ и назначил ее переменной?

1

Решение

Существует два основных варианта получения результатов процесса:

  • Перенаправьте его в файл, затем прочитайте файл позже.
  • Используйте трубу.

Каналы не поддерживаются стандартной библиотекой, кроме как скрытые за общей абстракцией потока. Фактически это означает, что процесс A, который создает процесс B, не может связываться с B через каналы, если для этого не используются специфические для платформы функции. В Windows поддержка сценариев, Windows Script Host, имеет прямую функциональность для конвейерного подхода, основанного на опросе для вывода из B. На гораздо более низком уровне вы можете использовать CreateProcess API-функция. Но это не тривиально.

Используя временный файл в качестве канала связи и используя только стандартные функциональные возможности C ++, вы просто вызываете программу B через интерпретатор команд, который может перенаправить вывод B. Этот интерпретатор команд и его синтаксис составляют специфическую часть платформы. Так что даже этот подход зависит от платформы, но код C ++ как таковой переносим.


В Windows стандартная команда intepreter cmd.exeи использует обычный Unix > синтаксис для перенаправления вывода программы, поэтому команда, которая должна быть выполнена

cmd /c "b.exe >tempfile"

Вы можете выполнить такую ​​команду через C ++ system. system Функция уже выполняет указанную команду через командный интерпретатор, который в Windows cmd.exe, И поэтому аргумент system нужно только

b.exe > tempfile

где tempfile это имя или полный путь к файлу, в котором вы хотите получить результат.

Вы можете создать новое временное имя файла через tmpnam функция.

0

Другие решения

Я предполагаю, что тег winapi относится к нужному ответу и также указывает на платформу. Итак, я думаю, что ответ _popen

Пример:

#include <stdio.h>

int main()
{
FILE*  CommandResult = _popen("wmic csproduct get uuid", "rt"); //send the command to the cmd and return a pointer to the command result
char   line[256]; //a buffer to read from the file
while(fgets(line, 256, CommandResult)) printf(line); //read and print all lines one by one
_pclose(CommandResult);
scanf(line); //prevent the console from closing immediately
}

Редактировать:

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

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ЯВНЫХ
ПОДРАЗУМЕВАЕМЫЕ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ​​ГАРАНТИЙ ТОВАРНОГО ОБЕСПЕЧЕНИЯ,
ФИТНЕС ДЛЯ ОСОБЫХ ЦЕЛЕЙ И НЕФРИФРИНГЕНТОВ. НИ В КОЕМ СЛУЧАЕ
АВТОРЫ ИЛИ АВТОРСКИЕ ПРАВ ЧЕЛОВЕКА НЕСУТ ОТВЕТСТВЕННОСТЬ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УЩЕРБ ИЛИ ДРУГОЕ
ОТВЕТСТВЕННОСТЬ, ДЕЙСТВУЮЩАЯ ЛИ В ДЕЙСТВИИ С ДОГОВОРОМ, ИСПЫТАНИЕМ ИЛИ ИНЫМ ОБРАЗОМ, возникающим из
ИЛИ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ В
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ.

-5

По вопросам рекламы [email protected]