コード例 #1
0
 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));
 }
コード例 #2
0
        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));
        }