2011-01-06 15 views

Respuesta

5

Sin duda puede hacerlo, pero deberá utilizar el código administrado ya que la arquitectura de PowerShell se basa completamente en el modelo de objetos CLR.

no estoy seguro de la sintaxis de C++, pero se puede comenzar con la clase PowerShell en System.Management.Automation.dll y utilizar su método estático Create para crear una instancia a la que puedas datos del tubo y los comandos de marcha.

+1

Tenga en cuenta que también puede crear una DLL administrada específicamente para esto y usar una de [las soluciones aquí] (http://stackoverflow.com/questions/2719985/calling-managed-c-sharp-functions-from-unmanaged -c) para llamar desde C++ no administrado. – CherryDT

2

Tengo una respuesta que podría resolver su problema, aunque no es literalmente una respuesta a la pregunta que hizo.

Bueno, lo que necesito en mi proyecto actual es una llamada al sistema que no abre una ventana y que me da la oportunidad de leer los resultados escritos en salida estándar o error estándar.

En caso de que se puede vivir con eso - aquí hay un código de la base de código antes mencionado:

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() : ""; 
    } 
} 

También: por favor, perdóname que el código está en C# en lugar de C++.

Como puede ver, llama a cualquier programa y no utiliza PowerShell. Si eso ya es una solución para ti, está bien. De lo contrario, podría considerar llamar a Powershell desde la línea de comandos usando this approach y posiblemente llegar a donde desea que sea de esa manera.

Espero que ayude o al menos te dé una idea.

Cuestiones relacionadas