【发布时间】:2019-01-03 13:17:33
【问题描述】:
我创建了一个 CMDHandler 类来处理我在项目中拥有的所有 CMD 命令。
例如:
CMDHandler.Run("/c \"" + DWClientSetupChainerV1 + "\"");
CMDHandler.Run("taskkill /F /IM \"DWClientSetupChainerV1 .exe\"");
虽然我的 CMDHandler 的进程似乎从未关闭,因此它无法启动第二个。有人知道我做错了什么吗? 仅供参考:退出代码并不总是被使用。
namespace Automated_Tests
{
class CMDHandler
{
private static readonly ILogger logger = LoggerFactory.Create(typeof(Program));
public int Run(string command)
{
var proc = new Process();
try
{
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "CMD",
Arguments = command,
UseShellExecute = false
};
proc = Process.Start(startInfo);
proc.WaitForExit();
return proc.ExitCode;
}
catch (Exception ex)
{
logger.Log(LogLevel.Error, ex.Message);
}
finally
{
proc.Close();
}
return 0;
}
}
}
【问题讨论】:
-
command传递的具体内容是什么? (CMD.EXE需要/c参数来执行其他命令;比如说cmd.exe /c <mycommand>)。对于大多数用途,cmd.exe不需要作为包装器(除非您启动批处理文件)。 -
我正在尝试启动一个可执行文件,然后再次关闭它:"/c \"" + DWClientSetupChainerV1 + "\"" 然后是 "taskkill /F /IM \"DWClientSetupChainerV1.exe\" "
-
您应该将该信息添加到您的问题中。除此之外,运行
taskkill你不需要cmd.exe。使用(示例)FileName = "taskkill"、Arguments = "/F /IM \"...\""或FileName = "cmd"、Arguments = "/c " + command(传递您在commands中所做的操作)。 -
WaitForExit不会阻塞当前线程吗?您是否使用单独的线程来第二次调用Run? -
嘿,Thomas,不,这不是阻塞。制作了一个单独的线程。