当前位置: 首页 > 编程语言 > C#

RunaProcessintheCurrentConsole分享

时间:2023-04-10 23:14:59 C#

RunaProcessintheCurrentConsole以便它使用当前控制台窗口。我的意思是我不想重定向输入/输出;我希望进程从当前控制台获取输入并将输出直接打印到同一个控制台窗口。原因是我想允许此子进程为输出设置控制台颜色,如果我重定向进程的标准输出则不会发生这种情况。另外,我目前正在使用代码while(!process.HasExited)process.StandardInput.WriteLine(Console.ReadLine());将标准输入重定向到进程。但是,如果进程在输入后立即退出(例如,我键入“exit”+ENTER,然后进程退出),则此循环再次运行,因此控制台正在等待用户的输入,这是从未使用过的(出来)。所以,问题很简单,我如何在当前控制台中运行一个进程,以便它可以设置控制台颜色并直接从控制台获取输入?编辑:以下是我的代码中与此问题相关的方法:staticintrunExe(stringexePath,paramsstring[]args){ProcessStartInfostartInfo=newProcessStartInfo(exePath,args){ErrorDialog=false,UseShellExecute=false,CreateNoWindow=true,RedirectStandardInput=true,RedirectStandardOutput=true,RedirectStandardError=true,RedirectStandardInput=true};Processprocess=newProcess(){StartInfo=startInfo};过程。开始();ReadThreadStatestdout=readThread(process.StandardOutput);falseReadThreadStatestderr=readThread(process.StandardError,true);while(!process.HasExited)process.StandardInput.WriteLine(Console.ReadLine());stdout.stop=stderr.stop=true;返回过程.ExitCode;}类ReadThreadState{publicboolstop;}privatestaticReadThreadStatereadThread(StreamReaderreader,boolisError){ReadThreadStatestate=newReadThreadState();新线程(()=>{while(!state.stop){国际电流;while((current=reader.Read())>=0)if(isError)writeError(((char)current).ToString(),ConsoleColor.Red);否则Console.Write((char)current);}})。开始();返回状态;您需要创建ProcessStartInfo并将UseShellExecute设置为false:varinfo=newProcessStartInfo("program.exe","arguments");info.UseShellExecute=false;varproc=Process.Start(信息);proc.WaitForExit();这将使用上述技术在同一个控制台Worker程序中启动您的程序:privatestaticvoidMain(string[]args){Console.WriteLine("Startingprogram");varsaveColor=Console.BackgroundColor;Console.BackgroundColor=ConsoleColor.Blue;varinfo=newProcessStartInfo("cmd","/ctime");info.UseShellExecute=false;varproc=Process.Start(信息);过程.WaitForExit();Console.BackgroundColor=saveColor;Console.WriteLine("程序退出");控制台.ReadLine();当您运行该程序时,它会启动一个新的cmd.exe副本并运行time命令,该命令将要求输入。我只是以cmd.exe为例来说明。任何从标准输入读取的程序都可以工作。另请注意,控制台颜色效果很好。吉姆米歇尔的回答就像一个魅力。我正在将一些批处理文件处理转移到C#中,并且效果很好。您可能会发现这个实用的小方法很方便。只需使用命令行并像批处理文件中的CALL一样运行它。在实用类中填写即可:以上就是C#学习教程的全部内容:在当前控制台运行进程。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicstaticvoidRunCmd(stringcommand){Process.Start(newProcessStartInfo("cmd.exe","/c"+command){UseShellExecute=false}).WaitForExit();}本文收集自网络,不代表立场。侵权请点击右侧联系管理员删除。如需转载请注明出处: