/// <summary> /// Trata el fin de la ejecución del proceso /// </summary> private void TreatEndScript(PowerShellInstance processor, Action endCallBack) { // Recoge los datos de salida foreach (object item in processor.OutputObjects) { OutputItems.Add(item); } // Recoge los errores foreach (string error in processor.Errors) { Errors.Add(error); } // Llama a la acción indicada por el creador y lanza el evento de fin endCallBack?.Invoke(); EndExecute?.Invoke(this, EventArgs.Empty); }
/// <summary> /// Ejecuta un script de PowerShell /// </summary> internal void Process() { // Ejecuta el script try { using (PowerShell instance = PowerShell.Create()) { Collection <PSObject> outputItems; // Añade el script a PowerShell instance.AddScript(Script); // Añade los parámetros de entrada if (InputParameters != null) { foreach (KeyValuePair <string, object> parameter in InputParameters) { instance.AddParameter(parameter.Key, parameter.Value); } } // Llama a la ejecución de PowerShell outputItems = instance.Invoke(); // Guarda los valores de salida foreach (PSObject outputItem in outputItems) { OutputObjects.Add(outputItem.BaseObject); } // Guarda los errores if (instance.Streams.Error.Count > 0) { foreach (ErrorRecord error in instance.Streams.Error) { Errors.Add(error.ToString()); } } } } catch (Exception exception) { Errors.Add(exception.Message); } // Llama al evento de fin de proceso EndExecute?.Invoke(this, EventArgs.Empty); }
/// <summary> /// Ejecuta el script /// </summary> public void Execute(Action endCallback = null) { Task task; PowerShellInstance processor = new PowerShellInstance(Script, InputParameters); // Limpia los datos de salida OutputItems.Clear(); Errors.Clear(); // Asigna el manejador de eventos processor.EndExecute += (sender, args) => TreatEndScript(processor, endCallback); // Crea la tarea para la ejecución en otro hilo task = new Task(() => processor.Process()); // Arranca la tarea try { task.Start(); } catch (Exception exception) { Errors.Add($"Error when execute script {exception.Message}"); endCallback?.Invoke(); EndExecute?.Invoke(this, EventArgs.Empty); } }