public static Task <ScriptExecutingResult> ExecuteScriptAsync(string fileName, string arguments, ScriptExecutionSettings settings, Action <string> onDataReceived = null, Action <string> onError = null, CancellationToken cancellationToken = default(CancellationToken)) { return(Task.Run(() => ExecuteScript(fileName, arguments, settings, onDataReceived, onError, cancellationToken), cancellationToken)); }
public static ScriptExecutingResult ExecuteScript(string fileName, string arguments, ScriptExecutionSettings settings, Action <string> onDataReceived = null, Action <string> onError = null, CancellationToken cancellationToken = default(CancellationToken)) { Process process = null; if (onDataReceived == null) { onDataReceived = Output.WriteLine; } if (onError == null) { onError = Output.WriteLine; } if (cancellationToken.IsCancellationRequested) { return(ScriptExecutingResult.False()); } #region Check for Powershell if (IsPowerShell(fileName)) { try { var r = ExecutePowershellScript(fileName, null, o => onDataReceived(o.ToString()), record => onError(record.Exception.Message)); return(ScriptExecutingResult.FromResult(r != null && r.Any())); } catch (Exception) { return(ScriptExecutingResult.False()); } } #endregion if (settings.ExecuteWithCmd) { arguments = $"/c {fileName} " + arguments; fileName = "cmd"; } bool requiresAdminPrivileges = settings.RequiresAdminPrivileges && !IsAdmin; bool result = false; try { var workingDirectory = settings.WorkingDirectory ?? Path.GetDirectoryName(fileName); //workingDirectory = @"C:\Dev\HEAD\Tests\CP.Air"; var processInfo = new ProcessStartInfo(fileName) { Verb = settings.RequiresAdminPrivileges ? "runas" : string.Empty }; if (!string.IsNullOrEmpty(workingDirectory)) { processInfo.WorkingDirectory = workingDirectory; } if (settings.IsHidden && !requiresAdminPrivileges) { processInfo.UseShellExecute = false; processInfo.RedirectStandardError = true; processInfo.RedirectStandardInput = true; processInfo.RedirectStandardOutput = true; processInfo.CreateNoWindow = true; } if (!string.IsNullOrEmpty(arguments)) { processInfo.Arguments = arguments; } var p = new Process { StartInfo = processInfo }; process = p; cancellationToken.Register(() => { Check.TryCatch <Exception>(() => { if (!p.HasExited) { p.Kill(); } }); }); if (settings.IsHidden) { p.OutputDataReceived += (sender, args) => { if (!cancellationToken.IsCancellationRequested && onDataReceived != null) { onDataReceived(args.Data); } }; p.ErrorDataReceived += (sender, args) => { if (!cancellationToken.IsCancellationRequested && onError != null) { onError(args.Data); } }; //p.EnableRaisingEvents = true; } p.EnableRaisingEvents = true; if (cancellationToken.IsCancellationRequested) { return(ScriptExecutingResult.False(p)); } result = p.Start(); p.Exited += (sender, args) => result = result && p.ExitCode == 0; if (settings.TrackLiveOutput && p.StartInfo.RedirectStandardOutput) { p.BeginOutputReadLine(); if (settings.WaitForProcessExit) { p.WaitForExit(); } } else { if (settings.IsHidden && p.StartInfo.RedirectStandardOutput) { StreamWriter sw = p.StandardInput; StreamReader sr = p.StandardOutput; StreamReader err = p.StandardError; sw.AutoFlush = true; sw.WriteLine(" "); sw.Close(); string output = sr.ReadToEnd(); string error = err.ReadToEnd(); if (!cancellationToken.IsCancellationRequested) { onDataReceived(output); onError(error); } } if (settings.WaitForProcessExit) { p.WaitForExit(); } } } catch (Exception e) { Output.WriteLine(e.Message); } return(ScriptExecutingResult.FromResult(result, process)); }