需要输入时,从Process StandardOut读取提示

时间:2015-03-19 06:47:41

标签: c# .net stream

我正在使用System.Diagnostics.Process创建一个新进程并与操作系统通信以运行命令。

该命令有时需要用户名,密码,两者都没有。

如果我从StandardOutput读取它将立即退出。如果我只是盲目地提供密码\ n,当我知道它需要在测试场景中使用密码时,它可以工作,与第三方进行身份验证,我可以从StandardOutput读取以获得结果。

作为测试,我尝试了这个:

            while (_process.StandardOutput.Peek() > -1)
            Log.Info((char)_process.StandardOutput.Read());

这将导致命令立即退出并且无法完成退出代码。我尝试了各种各样的方法,但我无法找出一种方法来确定它是否需要用户名或密码或已经存在(它只是输出结果集)。

我需要做(伪代码)

shellCommand(args)
ReadOutput()
if (requiresUsername)
   supplyUsernmame
if (requiresPassword)
   supplyPassword
OutputResults()

我知道命令会显示第一个单词的用户名或密码,如果它需要,然后等我提供它。

1 个答案:

答案 0 :(得分:1)

这是基本的开始:

Process myProcess = new Process();
myProcess .StartInfo.FileName = "yourCommand.exe";
myProcess .StartInfo.Arguments = "-yourArguments";
myProcess .StartInfo.UseShellExecute = false;//do not open shell window
myProcess .StartInfo.RedirectStandardOutput = true; // allows you to manipulate or suppress the output of a process
myProcess.StartInfo.RedirectStandardInput = true;// allows you to manipulate or suppress the input of a process
myProcess .Start()

在此之后,youCommand.exe的输出非常可靠。

如果你的Command.exe在一行中询问用户并且提示插入符号转到了新的行,例如输入用户名:/ r / n ,那么你可以执行一个进程.StandardOutput.ReadLine() ;并解析该行以查看是否要求用户或是另一条消息。

如果没有新行,您必须处理thread.sleep和循环,以查看您的Command.exe何时请求输入。

在询问用户时使用新行的示例,在请求密码时没有新行:

这是yourCommand.exe

class ConsoleApplication1
{
    void Main()
    {
        Console.WriteLine("User:");
        string user = Console.ReadLine();
        Console.Write("Password:");//no new line!!!
        string pass = Console.ReadLine();
        Console.WriteLine(string.Format("The user {0} has the password {1}", user, pass));
    }
}

这就是你要做的事情:

namespace ConsoleApplication2
{
 class Program
 {
  static void Main(string[] args)
  {
   Process myProcess = new Process();
   myProcess.StartInfo.FileName = @"C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe";
   // myProcess.StartInfo.Arguments = "-yourArguments";
   myProcess.StartInfo.UseShellExecute = false;//do not open shell window
   myProcess.StartInfo.RedirectStandardOutput = true; // allows you to manipulate or suppress the output of a process
   myProcess.StartInfo.RedirectStandardInput = true;// allows you to manipulate or suppress the input of a process
   myProcess.Start();
 //  Thread.Sleep(1000);//no need to wait, next ReadLine wait for you
   Console.WriteLine(myProcess.StandardOutput.ReadLine());
   myProcess.StandardInput.WriteLine("jlvaquero");//send user name to consoleapp1
   Thread.Sleep(1000);//need to wait consoleapp1 to ask for pwd because we can not use ReadLine
   char[] myBuffer = new char[1];
   while (myBuffer[0] != ':') //read until double dot wich is the last char of "Password:"
   {
     myProcess.StandardOutput.Read(myBuffer, 0, 1);
    Console.Write(myBuffer[0]);
   }
   Console.WriteLine();//just to get readable output for the example
   myProcess.StandardInput.WriteLine("1234");//send pwd to consoleapp1
   Console.Write(myProcess.StandardOutput.ReadLine());//show the output of consoleapp1
   Console.Read();
  }
 }
}