public ChildProcessStartInfoInternal(ChildProcessStartInfo startInfo) { var flags = startInfo.Flags; FileName = startInfo.FileName; Arguments = startInfo.Arguments; WorkingDirectory = startInfo.WorkingDirectory; Flags = flags; CodePage = startInfo.CodePage; SearchPath = startInfo.SearchPath; StdInputRedirection = startInfo.StdInputRedirection; StdOutputRedirection = startInfo.StdOutputRedirection; StdErrorRedirection = startInfo.StdErrorRedirection; StdInputFile = startInfo.StdInputFile; StdOutputFile = startInfo.StdOutputFile; StdErrorFile = startInfo.StdErrorFile; StdInputHandle = startInfo.StdInputHandle; StdOutputHandle = startInfo.StdOutputHandle; StdErrorHandle = startInfo.StdErrorHandle; if (!flags.HasDisableEnvironmentVariableInheritance() && startInfo.CreationContext is null && startInfo.ExtraEnvironmentVariables.Count == 0) { UseCustomEnvironmentVariables = false; EnvironmentVariables = default; }
public ChildProcessStartInfoInternal(ChildProcessStartInfo startInfo) { FileName = startInfo.FileName; Arguments = startInfo.Arguments; WorkingDirectory = startInfo.WorkingDirectory; EnvironmentVariables = startInfo.EnvironmentVariables; Flags = startInfo.Flags; CodePage = startInfo.CodePage; SearchPath = startInfo.SearchPath; StdInputRedirection = startInfo.StdInputRedirection; StdOutputRedirection = startInfo.StdOutputRedirection; StdErrorRedirection = startInfo.StdErrorRedirection; StdInputFile = startInfo.StdInputFile; StdOutputFile = startInfo.StdOutputFile; StdErrorFile = startInfo.StdErrorFile; StdInputHandle = startInfo.StdInputHandle; StdOutputHandle = startInfo.StdOutputHandle; StdErrorHandle = startInfo.StdErrorHandle; // Additional parameters CreateNewConsole = Flags.HasCreateNewConsole() || !ConsolePal.HasConsoleWindow(); }
private SafeFileHandle ChooseOutput( OutputRedirection redirection, string fileName, SafeFileHandle handle, SafeFileHandle outputPipe, SafeFileHandle errorPipe) { switch (redirection) { case OutputRedirection.ParentOutput: return(ConsolePal.GetStdOutputHandleForChild() ?? OpenNullDevice(FileAccess.Write)); case OutputRedirection.ParentError: return(ConsolePal.GetStdErrorHandleForChild() ?? OpenNullDevice(FileAccess.Write)); case OutputRedirection.OutputPipe: return(outputPipe); case OutputRedirection.ErrorPipe: return(errorPipe); case OutputRedirection.File: return(OpenFile(fileName, FileMode.Create, FileAccess.Write, FileShare.Read)); case OutputRedirection.AppendToFile: return(OpenFile(fileName, FileMode.Append, FileAccess.Write, FileShare.Read)); case OutputRedirection.Handle: return(handle); case OutputRedirection.NullDevice: return(FilePal.OpenNullDevice(FileAccess.Write)); default: throw new ArgumentOutOfRangeException(nameof(redirection), "Not a valid value for " + nameof(OutputRedirection) + "."); } }
private static bool IsFileRedirection(OutputRedirection redirection) => redirection == OutputRedirection.File || redirection == OutputRedirection.AppendToFile;
public PipelineStdHandleCreator( InputRedirection stdInputRedirection, OutputRedirection stdOutputRedirection, OutputRedirection stdErrorRedirection, string stdInputFile, string stdOutputFile, string stdErrorFile, SafeFileHandle stdInputHandle, SafeFileHandle stdOutputHandle, SafeFileHandle stdErrorHandle) { if (stdInputRedirection == InputRedirection.Handle && stdInputHandle == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdInputHandle)); } if (stdInputRedirection == InputRedirection.File && stdInputFile == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdInputFile)); } if (stdOutputRedirection == OutputRedirection.Handle && stdOutputHandle == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdOutputHandle)); } if (IsFileRedirection(stdOutputRedirection) && stdOutputFile == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdOutputFile)); } if (stdErrorRedirection == OutputRedirection.Handle && stdErrorHandle == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdErrorHandle)); } if (IsFileRedirection(stdErrorRedirection) && stdErrorFile == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdErrorFile)); } bool redirectingToSameFile = IsFileRedirection(stdOutputRedirection) && IsFileRedirection(stdErrorRedirection) && stdOutputFile == stdErrorFile; if (redirectingToSameFile && stdErrorRedirection != stdOutputRedirection) { throw new ArgumentException( "StdOutputRedirection and StdErrorRedirection must be the same value when both stdout and stderr redirect to the same file.", nameof(ChildProcessStartInfo.StdErrorRedirection)); } try { if (stdInputRedirection == InputRedirection.InputPipe) { (this.InputStream, _inputReadPipe) = FilePal.CreatePipePairWithAsyncServerSide(System.IO.Pipes.PipeDirection.Out); } if (stdOutputRedirection == OutputRedirection.OutputPipe || stdErrorRedirection == OutputRedirection.OutputPipe) { (this.OutputStream, _outputWritePipe) = FilePal.CreatePipePairWithAsyncServerSide(System.IO.Pipes.PipeDirection.In); } if (stdOutputRedirection == OutputRedirection.ErrorPipe || stdErrorRedirection == OutputRedirection.ErrorPipe) { (this.ErrorStream, _errorWritePipe) = FilePal.CreatePipePairWithAsyncServerSide(System.IO.Pipes.PipeDirection.In); } this.PipelineStdIn = ChooseInput( stdInputRedirection, stdInputFile, stdInputHandle, _inputReadPipe); this.PipelineStdOut = ChooseOutput( stdOutputRedirection, stdOutputFile, stdOutputHandle, _outputWritePipe, _errorWritePipe); if (redirectingToSameFile) { this.PipelineStdErr = this.PipelineStdOut; } else { this.PipelineStdErr = ChooseOutput( stdErrorRedirection, stdErrorFile, stdErrorHandle, _outputWritePipe, _errorWritePipe); } } catch { Dispose(); throw; } }