C#处理调用,与标准输入和标准输出交互我有一个执行命令的点击按钮。该命令可能会提示一些标准输入,我需要响应该输入,问题是程序运行的方式可能每天都不同,因此我需要相应地解释标准输出并重定向标准输入。我有这个简单的代码,它逐行读取stdout,当它看到密码提示时它发送stdin但程序只是挂起,因为它从未看到密码提示,但是当我运行时批处理文件中有密码提示。这是我调用来执行此测试的批处理文件:@echooffecho这是对提示echo的测试在提示符下,输入响应set/Pp1=EnterthePassword:echoyouentered"%p1%"Here是从命令行运行时该批处理文件的输出:C:ProjectsSPPMOSSTesterSPPTesterbinDebug>test4.bat这是对提示的测试在提示符下,输入响应输入密码:Test1你输入的是“Test1”这就是我使用的调用挂起的批处理文件的C#片段:varproc=newProcess();proc.StartInfo.FileName="cmd.exe";proc.StartInfo.Arguments="/ctest4.bat";proc.StartInfo.RedirectStandardOutput=true;proc.StartInfo.RedirectStandardError=true;proc.StartInfo.RedirectStandardInput=true;proc.StartInfo.UseShellExecute=false;proc.StartInfo.CreateNoWindow=true;提示输入密码StreamReadersr=proc.StandardOutput;while(!sr.EndOfStream){stringline=sr.ReadLine();调试.WriteLine(线);if(line.Contains("Password")){Debug.WriteLine("密码提示找到,输入密码word");proc.StandardInput.WriteLine("thepassword");}}sr.Close();proc.WaitForExit();这是我看到的调试标准输出,注意我从来没有看到密码提示,为什么会这样?它只是挂起?这是对提示的测试在提示时,输入响应有没有办法让我可以观察stdout来提示并相应地响应它?你的主要问题是你正在使用sr.ReadLine()流对于读者这是一个问题,因为密码提示会停止,直到用户输入新行(输入密码后按回车键),所以你需要一次读取流1个字符。这个例子应该让你开始。while(!sr.EndOfStream){varinputChar=(char)sr.Read();input.Append(inputChar);if(StringBuilderEndsWith(input,Environment.NewLine)){varline=input.ToString();输入=新的StringBuilder();调试.WriteLine(线);}elseif(StringBuilderEndsWith(input,"Password:")){Debug.WriteLine("找到密码提示,输入密码");proc.StandardInput.WriteLine("密码");varline=input.ToString();输入=新的StringBuilder();调试.WriteLine(线);}}privatestaticboolStringBuilderEndsWith(StringBuilderhaystack,stringneedle){varneedleLength=needle.Length-1;=haystack.Length-1;for(inti=0;i使用process类,可以直接运行批处理文件。标准I/O可能走不过去,因为要先走cmd以上是C#学习教程:C#processingCall,所有与标准输入和标准输出交互分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注---proc.StartInfo.FileName="test4.bat";proc.StartInfo.Arguments="";本文采集自网络,不代表立场,如涉及侵权,请点右联系管理员删除,如需转载请注明出处:
