通过C#console-app执行一些命令

时间:2019-04-08 23:07:55

标签: c# npm console-application

我是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();
    }

1 个答案:

答案 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();