我正在使用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()
我知道命令会显示第一个单词的用户名或密码,如果它需要,然后等我提供它。
答案 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();
}
}
}