我是C#的新手(通常是开发人员)。我需要用C#编写一个将通过控制台执行的方法: -安装纽曼; -执行邮递员运行。
我创建了一个如下所示的方法(我尝试了2个选项:ReadToEnd和WaitForExit),但是似乎停留在每个步骤中。
任何帮助如何使它依次执行两个命令(第一个需要在第二个开始之前完成)并在第二个命令完全执行后退出吗?
谢谢。
public string Runner ()
{
string readOutput = null;
var psiNpm = new ProcessStartInfo
{
FileName = "cmd",
RedirectStandardOutput = true,
RedirectStandardInput = true,
UseShellExecute = false
};
var pNpmRun = Process.Start(psiNpm);
pNpmRun.StandardInput.WriteLine($"npm install -g newman");
pNpmRun.WaitForExit();
//pNpmRun.StandardOutput.ReadToEnd();
pNpmRun.StandardInput.WriteLine($"newman run " +
$"\"C:\\Postman\\Test.postman.json\" " +
$"--folder \"TestSearch\" " +
$"--environment \"C:\\Postman\\postman_environment.json\" " +
$"--disable-unicode");
pNpmRun.StandardOutput.ReadToEnd();
pNpmRun.WaitForExit();
return readOutput = pNpmRun.StandardOutput.ReadLine();
}
答案 0 :(得分:3)
尝试向
<target name="wsdl" depends="compile">
<taskdef name="java2wsdl" classname="org.apache.ws.java2wsdl.Java2WSDLTask" classpathref="axis2.classpath"/>
<java2wsdl className="edu.asupoly.ser422.lab4.Lab4Service" outputLocation="${build}">
<classpath>
<pathelement path="${axis2.classpath}"/>
<pathelement location="${classes.dir}"/>
</classpath>
</java2wsdl>
</target>
输入流中写入exit
命令。
问题在于,您发送的命令(npm,newman)正在执行,然后控制权返回到外壳程序(cmd),然后外壳程序正在等待发送更多用户输入。您需要通过发送“退出”来告诉它退出。您应该只有1个WaitForExit调用。 WaitForExit正在等待cmd
进程退出,而不是您发送给它的单个命令。
接下来,您应该在流程退出后(cmd
之后)移动ReadToEnd
。这是一个关于为什么的问题:ReadToEnd from std output of process and waitforexit
所以,像这样:
WaitForExit
您还可以考虑将超时添加到WaitForExit。如果这些cmds由于某种原因而卡住,则您的调用过程也将因等待它们完成而卡住。通常最好最终失败,而不是拥有一堆挂起的进程。如果超时到期,则可以终止该进程。
public string Runner ()
{
var psiNpm = new ProcessStartInfo
{
FileName = "cmd",
RedirectStandardOutput = true,
RedirectStandardInput = true,
UseShellExecute = false
};
var pNpmRun = Process.Start(psiNpm);
pNpmRun.StandardInput.WriteLine("npm install -g newman");
pNpmRun.StandardInput.WriteLine("newman run " +
"\"C:\\Postman\\Test.postman.json\" " +
"--folder \"TestSearch\" " +
"--environment \"C:\\Postman\\postman_environment.json\" " +
"--disable-unicode");
pNpmRun.StandardInput.WriteLine("exit");
pNpmRun.WaitForExit();
return pNpmRun.StandardOutput.ReadToEnd();