将命令行输出重定向到 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。
我不确定您是否要实际返回命令的输出作为对发布的响应,但是更改后的"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;
}