Доступ к Powershell через Visual C ++ (API) - PullRequest
11 голосов
/ 06 января 2011

Я хотел бы написать программу, которая эффективно "передает" Powershell, чтобы я мог отправлять команды и анализировать ответы в C ++, фактически не открывая приглашение на экране.

Любые советы?

Ответы [ 2 ]

6 голосов
/ 06 января 2011

Конечно, вы можете сделать это, но вам нужно будет использовать управляемый код, поскольку архитектура PowerShell полностью основана на объектной модели CLR.

Я не уверен в синтаксисе C ++, но вы можете начать с PowerShell класс в System.Management.Automation.dll и использование его статического Create метода для создания экземпляра, к которому можно передавать данные и выполнять команды.

3 голосов
/ 13 мая 2016

У меня есть ответ, который может решить вашу проблему, хотя это не буквально ответ на вопрос, который вы задали.

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

На случай, если вы можете с этим смириться - вот код из вышеупомянутой кодовой базы:

public class RsbSystem
{
    string command = null;
    string param = null;
    string commandLine = null;
    public int ExitCode = 0;

    //..

    /// <summary>Exec for apps that don't want console output</summary>
    /// <param name="msg">returns output of called program</param>
    /// <returns>0 if ok</returns>
    /// <remarks>RsbSystem instance keeps the result in member ExitCode</remarks>
    public int Exec(ref string msg)
    {
        var p = new Process();
        p.StartInfo.FileName = command;
        p.StartInfo.Arguments = param;
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.Start();
        if (!p.StandardOutput.EndOfStream)
            msg = p.StandardOutput.ReadToEnd();
        if (!p.StandardError.EndOfStream)
            msg += p.StandardError.ReadToEnd();
        p.WaitForExit(120000);  // this needs to come after readToEnd() RSB: https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput(v=vs.110).aspx
        ExitCode = p.ExitCode;
        p.Dispose();
        return ExitCode;
    }

    // ..

    public RsbSystem(string cmdLine)
    {
        commandLine = cmdLine;
        var pos = 0;
        if (cmdLine[0] == '"')
            pos = cmdLine.IndexOf("\" ") + 1;
        else pos = cmdLine.IndexOf(" ");
        command = pos > -1 ? cmdLine.Substring(0, pos).Trim() : cmdLine;
        param = pos > -1 ? cmdLine.Substring(pos + 1).TrimStart() : "";
    }
}

Также: простите, пожалуйста, что код написан на C # вместо C ++.

Как вы можете видеть, он вызывает любую программу и не использует PowerShell.Если это уже обходной путь для вас - хорошо.Если нет, вы можете подумать о том, чтобы вызвать Powershell из командной строки, используя этот подход и, возможно, получить то, что вам нужно.

Надеюсь, это поможет или хотя бы даст вам представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...