private void InternalStart(params string[] arguments) { if (IsRunning) { throw new InvalidOperationException(Resources.ProcessRunnerAlreadyRunning); } _isRunning = true; _mreProcessExit.Reset(); _mreOutputDone.Reset(); _mreErrorDone.Reset(); _exitCode = 0; _stdIn = null; _running = new Process(); string stringArgs = ArgumentList.Join(arguments); ProcessStartInfo psi = new ProcessStartInfo(_executable, stringArgs); psi.WorkingDirectory = this.WorkingDirectory; psi.RedirectStandardInput = true; psi.RedirectStandardError = true; psi.RedirectStandardOutput = true; psi.CreateNoWindow = true; psi.UseShellExecute = false; psi.ErrorDialog = false; _running.StartInfo = psi; _running.Exited += process_Exited; _running.OutputDataReceived += process_OutputDataReceived; _running.ErrorDataReceived += process_ErrorDataReceived; _running.EnableRaisingEvents = true; Trace.TraceInformation("EXEC: {0} {1}", _running.StartInfo.FileName, _running.StartInfo.Arguments); _running.Start(); _stdIn = _running.StandardInput; _running.BeginOutputReadLine(); _running.BeginErrorReadLine(); }
public void TestParseJoin() { // all of these result in three argument values and should re-join exactly as appears string[] test_valid_strings = new string[] { "a b c", "a b \"c c\"", "a b \" c \"", "a \"b\"\"b\" c", "a \"\"\"b\"\"\" c", }; foreach (string testinput in test_valid_strings) { string[] result = ArgumentList.Parse(testinput); Assert.AreEqual(3, result.Length, "failed to find three values"); string joined = ArgumentList.Join(result); Assert.AreEqual(testinput, joined, "failed to parse/join correctly"); } //the following do not re-join exactly: Assert.AreEqual("a b c", ArgumentList.Join(ArgumentList.Parse("a \"b\" c")), "failed to parse/join correctly"); Assert.AreEqual("a \"b\"\"b\" c", ArgumentList.Join(ArgumentList.Parse("a b\"b c")), "failed to parse/join correctly"); Assert.AreEqual("a b c", ArgumentList.Join(ArgumentList.Parse("a b \"c")), "failed to parse/join correctly"); }
public void TestJoinNull() { ArgumentList.Join(null); }
/// <summary> Returns a debug-view string of process/arguments to execute </summary> public override string ToString() { return(String.Format("{0} {1}", _executable, ArgumentList.Join(_arguments))); }
public void Generate(IGeneratorArguments input) { //Couple of assertions about PowerShell if (_config.Script.Type == ScriptEngine.Language.PowerShell && (_config.StandardInput.Redirect || _config.Arguments.Length > 0)) { throw new ApplicationException( @"Currently PowerShell integration does not support input streams or arguments. Primarily this is due to circumventing the script-signing requirements. By using the '-Command -' argument we avoid signing or setting ExecutionPolicy."); } using (DebuggingOutput debug = new DebuggingOutput(_config.Debug, input.WriteLine)) { debug.WriteLine("ConfigDir = {0}", _config.BaseDirectory); input.ConfigDir = _config.BaseDirectory; //Inject arguments into the script string script = input.ReplaceVariables(Check.NotNull(_config.Script).Text.Trim()); if (!String.IsNullOrEmpty(_config.Script.Include)) { script = File.ReadAllText(CreateFullPath(_config.Script.Include)); } if (_config.Script.Type == ScriptEngine.Language.Exe) { script = CreateFullPath(script); } StringWriter swOutput = new StringWriter(); List <string> arguments = new List <string>(); foreach (GeneratorArgument arg in _config.Arguments) { arguments.Add(input.ReplaceVariables(arg.Text ?? String.Empty)); } debug.WriteLine("Prepared Script:{0}{1}{0}{2}{0}{1}", Environment.NewLine, "---------------------------------------------", script ); using (ScriptRunner scriptEngine = new ScriptRunner(_config.Script.Type, script)) { IRunner runner = scriptEngine; if (input.AllowAppDomains && _config.Script.InvokeAssembly) { runner = AssemblyRunnerCache.Fetch(scriptEngine.ScriptEngine.Executable); arguments.InsertRange(0, scriptEngine.ScriptArguments); } runner.WorkingDirectory = _config.BaseDirectory; string lastErrorMessage = null; ProcessOutputEventHandler handler = delegate(object o, ProcessOutputEventArgs args) { if (args.Error) { input.WriteLine(lastErrorMessage = args.Data); } else if (_config.StandardOut != null) { debug.WriteLine("std::out: {0}", args.Data); swOutput.WriteLine(args.Data); } else { input.WriteLine(args.Data); } }; int exitCode = -1; debug.WriteLine("Executing {0} {1}", runner, ArgumentList.Join(arguments.ToArray())); try { runner.OutputReceived += handler; if (_config.StandardInput.Redirect) { exitCode = runner.Run(new StringReader(File.ReadAllText(input.InputPath)), arguments.ToArray()); } else { exitCode = runner.Run(arguments.ToArray()); } } finally { debug.WriteLine("Exited = {0}", exitCode); runner.OutputReceived -= handler; } if (_config.StandardOut != null) { string target = Path.ChangeExtension(input.InputPath, _config.StandardOut.Extension); using (TempFile file = TempFile.FromExtension(_config.StandardOut.Extension)) { file.WriteAllText(swOutput.ToString()); File.Copy(file.TempPath, target, true); input.AddOutputFile(target); } } if (exitCode != 0) { string message = "The script returned a non-zero result: " + exitCode; input.WriteLine(message); throw new ApplicationException(String.IsNullOrEmpty(lastErrorMessage) ? message : lastErrorMessage); } } EnumOutputFiles(input, input.AddOutputFile); } }