将命令行输出重定向到 MVC 控制器

本文关键字:MVC 控制器 重定向 命令行 输出 | 更新日期: 2023-09-27 18:35:24

我正在开发一个使用 MVC 和 C# 和 Visual Studio 2013 的 Internet 应用程序。我需要实现一个能够自动登录网站的功能。为此,我使用了CasperJs框架。

以下代码创建一个线程,该线程将在命令行中执行 js 代码。

[HttpPost]
    public ActionResult Publish()
    {
        try
        {
            new Thread(new ParameterizedThreadStart(x =>
            {
                ExecuteCommand("casperjs test.js");
            })).Start();
            return new HttpStatusCodeResult(HttpStatusCode.OK);
        }
        catch (Exception e)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest, e.Message);
        }
    }
    private void ExecuteCommand(string Command)
    {
        try
        {
            ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe", "/K " + Command);
            processInfo.CreateNoWindow = true;
            processInfo.UseShellExecute = false;
            processInfo.RedirectStandardOutput = true;
            Process process = Process.Start(processInfo);
            string output = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
        }
        catch (Exception e)
        {
            Trace.Listeners.Add(new TextWriterTraceListener(e.ToString()));
        }
    }

为了确保一切顺利,我想将命令行中生成的输出重定向到我的控制器。我该怎么做?使用前面的代码,字符串输出始终为 null。

将命令行输出重定向到 MVC 控制器

我不确定您是否要实际返回命令的输出作为对发布的响应,但是更改后的"ExecuteCommand"方法应该有助于从进程中获取标准输出。 从那里,您可以根据该输出中可能包含的预期值执行您喜欢的操作。

[HttpPost]
public ActionResult Publish()
{
    try
    {
        string cmdResult = "";
        new Thread(new ParameterizedThreadStart(x =>
        {
            cmdResult = ExecuteCommand("casperjs test.js");
        })).Start();
        var response = Request.CreateResponse<string>(System.Net.HttpStatusCode.OK, cmdResult);
        return response;
    }
    catch (Exception e)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest, e.Message);
    }
}
private string ExecuteCommand(string Command)
{
    string result = "";
    try
    {
        ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe", "/K " + Command);
        processInfo.CreateNoWindow = true;
        processInfo.UseShellExecute = false;
        processInfo.RedirectStandardOutput = true;
        processInfo.RedirectStandardError = true;
        Process process = Process.Start(processInfo);
        process.WaitForExit();
        while (!process.StandardOutput.EndOfStream)
        {
            result += process.StandardOutput.ReadLine();
        }
        while (!process.StandardError.EndOfStream)
        {
            result += process.StandardError.ReadLine();
        }
    }
    catch (Exception e)
    {
        Trace.Listeners.Add(new TextWriterTraceListener(e.ToString()));
        throw;
    }
    return result;
}