Tengo una aplicación de consola y un método que ejecuta un script de PowerShell dentro de la aplicación de consola. Así que estoy tratando de obtener un texto de error que genera en la aplicación y hacer algo con él.
Ejemplo / Lo que estoy tratando de hacer:
If Error.contains("Object") { // do something here }Aquí está mi método actual
public void ExecutePowershellScript() { var file = @"C:\Path\filename.ps1"; var start = new ProcessStartInfo() { FileName = "powershell.exe", Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \"{file}\"", UseShellExecute = false }; Process.Start(start); }Process.start: ¿cómo obtener la salida?
Cuando cree su objeto de proceso, configure StartInfo apropiadamente:
var proc = new Process { StartInfo = new ProcessStartInfo { FileName = "program.exe", Arguments = "command line arguments to your executable", UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true } };luego inicie el proceso y lea de él:
proc.Start(); while (!proc.StandardOutput.EndOfStream) { string line = proc.StandardOutput.ReadLine(); // do something with line }Puede usar int.Parse() o int.TryParse() para convertir las cadenas en valores numéricos. Es posible que primero deba manipular las cadenas si hay caracteres numéricos no válidos en las cadenas que lee.
Puede configurar RedirectStandardError = true y acceder a cualquier error desde process.StandardError
public static void ExecutePowershellScript() { var file = @"C:\Path\filename.ps1"; var start = new ProcessStartInfo() { FileName = "powershell.exe", Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \"{file}\"", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }; using Process process = Process.Start(start); string output = process.StandardOutput.ReadToEnd(); string errors = process.StandardError.ReadToEnd(); }Bien, borra la sugerencia anterior. Después de ser corregido por mklement0,
Este es un intento perfectamente razonable, pero, desafortunadamente, puede provocar bloqueos (mientras espera que finalice la secuencia de uno, el otro, al exceder el tamaño del búfer, puede bloquear la ejecución del proceso). Si necesita capturar ambos flujos, debe recopilar la salida de uno de ellos a través de eventos. – mklement0
Cambié la solución para usar el evento ErrorDataReceived
public static async Task ExecutePowershellScript() { var file = @"C:\Path\filename.ps1"; var start = new ProcessStartInfo { FileName = "powershell.exe", Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \"{file}\"", UseShellExecute = false, // redirect standard error stream to process.StandardError RedirectStandardError = true }; using var process = new Process { StartInfo = start }; // Subscribe to ErrorDataReceived event process.ErrorDataReceived += (sender, e) => { // code to process the error lines in e.Data }; process.Start(); // Necessary to start redirecting errors to StandardError process.BeginErrorReadLine(); // Wait for process to exit await process.WaitForExitAsync(); }start.Start(); while (!start.StandardOutput.EndOfStream) { string line = start.StandardOutput.ReadLine(); }