Pregunta

Estoy experimentando un problema extraño cuando intento ejecutar una herramienta de línea de comandos .NET de forma remota utilizando PSEXEC.

  1. Cuando se ejecuta PSEXEC desde la línea de comandos, se ejecuta y completa bien.

  2. Al ejecutarlo desde una aplicación de consola (crear un proceso, ejecutar psexec.exe con los argumentos necesarios), se ejecuta bien.

  3. Al ejecutarlo desde nuestra herramienta personalizada interna que se utiliza para ejecutar diferentes tareas, se completa o no se completa con éxito.

Aquí está el código que estoy usando:

Process p = new Process();

p.StartInfo.FileName = @"C:\PsExec.exe";
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;

string arg = "-snapshot -display C:\*.msi -s";

p.StartInfo.Arguments = @"\\10.161.203.106 -u user -p pwd -cf C:\FVT.exe " + arg;

Logger.Info(this, "Starting process");

p.Start();
var ended = p.WaitForExit(60 * 1000);

if (!ended)
{
    throw new Exception("Process timed out.");
}

Logger.Info(this, "Process ended");

using (StreamReader sr = p.StandardOutput)
{
    string buffer = sr.ReadToEnd();
    Logger.Info(this, buffer);
}

¡Este código funciona bien desde la línea CMD, o desde una aplicación independiente!

No tengo idea de qué más podría estar mal aquí.

Nuestra herramienta interna genera un nuevo hilo y ejecuta este código en él.

Actualizar:

Línea de comando + args en la ventana de la línea de comandos - funcionando. El mismo CMD + Args, ejecute como un proceso con redirectandoput - puestos y devuelve el tiempo de espera.

¿Podría ser esto un error en .NET? (Esto sucede para otros progarms, archivos por lotes, etc.).

¿Fue útil?

Solución

No sé cuál es el error es, pero tengo un presentimiento de que si rediriges stderr (RedirectStandardError = true) y lea la transmisión Stderr (como lo haces con Stdout) te lo dirá. Alternativamente, mientras la depuración se va CreateNoWindow = false Y tal vez vea el mensaje de la consola (especialmente si está esperando un KeyPress; de lo contrario, podría desaparecer demasiado rápido para darse cuenta).

Tenga en cuenta que es posible que necesite configurar los lectores de Async en StDout/Stderr si el proceso no termina. Puedes hacer eso en hilos adicionales o a través del OutputDataReceived / ErrorDataReceived eventos (necesitas establecer EnableRaisingEvents a true además).


Si eso todavía no funciona; Podrías intentar correr con UseShellExecute=true. Esto significa que no podrás redirigir IO, por lo que es posible que tengas que usar > / >> etc. Para encender la salida a un archivo (idealmente en temperatura), luego lea el archivo.

Otros consejos

Intente agregar -acceteula a sus argumentos a PSEXEC

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top