【问题标题】:Process (CMD) is not closed hence no new process can be started进程(CMD)未关闭,因此无法启动新进程
【发布时间】: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,不,这不是阻塞。制作了一个单独的线程。

标签: c# cmd process


【解决方案1】:

我通过为我的 CMDHandler.Run 方法创建单独的任务找到了解决方法:

Task setupTask = new Task(() => CMDHandler.Run("/c  \"" + DWClientSetupChainerV1 + "\""));
setupTask.Start();
Thread.Sleep(10000);
Task killSetupTask = new Task(() => CMDHandler.Run("/c taskkill /F /IM \"DWClientSetupChainerV1.exe\"", true));
killSetupTask.Start();
Task.WaitAll(setupTask, killSetupTask);

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多