2016-03-26 5 views
3

В основном я пытаюсь создать программу, которая будет запускать и закрывать .bat-файл. Мне удалось запустить его, чтобы запустить файл bat, однако я не могу понять, как заставить его закрыть файл .bat.C# не удалось убить процесс

Вот код класса:

using System; 
using System.Diagnostics; 
using System.Threading; 
using System.ComponentModel; 

namespace Launcher 
{ 
    class MyProcess 
    { 
     public static void LaunchProcess() 
     { 
      Process myProcess = new Process(); 
      try 
      { 
       myProcess.StartInfo.UseShellExecute = false; 
       myProcess.StartInfo.FileName = "C:\example.bat"; 
       myProcess.StartInfo.CreateNoWindow = true; 
       myProcess.Start(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 
     } 
    } 
} 

Я знаю, что, чтобы убить процесс, который я должен был бы использовать myProcess.Kill(); однако я не уверен, как добавить его в код, как если бы я должен был повторно называем «launchprocess», то myProcess будет перезаписана

+0

Просто небольшое примечание: '' C: \ example.bat ", возможно, потребуется изменить на' 'C: \\ example.bat '' – Ian

+0

Это запустит Cmd.exe для запуска .bat-файла. Поэтому запустите cmd.exe самостоятельно, и вы можете его убить, используйте «/ c example.bat» для аргумента. Этого недостаточно, чтобы * также * обеспечить, чтобы вы убили любые процессы, запущенные файлом .bat. Трудно сделать надежно, вам нужно будет использовать объект задания или полагаться на опцию taskkill/t. –

ответ

0

Как о добавлении команды "Exit" в пакетном файле

+0

Вопрос, похоже, заключается в том, как закончить командный файл извне, а не сам пакетный файл. – Corey

+0

Использование Exit в пакетном файле гарантирует, что он не завершит пакетный файл преждевременно. Else process.Kill, скорее всего, путь – Eminem

1

Ваш код использует локальную переменную для хранения информации процесса и не сохранить его для последующих операций. Если вы хотите сохранить это как статический метод затем возвращают Process в результате:

public static class MyProcess 
{ 
    public static void LaunchProcess() 
    { 
     Process myProcess = new Process(); 
     try 
     { 
      myProcess.StartInfo.UseShellExecute = false; 
      myProcess.StartInfo.FileName = "C:\example.bat"; 
      myProcess.StartInfo.CreateNoWindow = true; 
      myProcess.Start(); 
      return myProcess; 
     } 
     catch (Exception e) 
     { 
      myProcess.Dispose(); 
      Console.WriteLine(e.Message); 
     } 
    } 
} 

Теперь у вас есть Process объект, представляющий новый процесс и может вызвать метод Kill на него, если вам нужно, чтобы избавиться от из этого.

Альтернативой является изменение этого значения на нестатический, и экземпляр класса завершает процесс по запросу. В зависимости от того, что вы делаете это, возможно, имеет смысл реализовать IDisposable:

public class MyProcess : IDisposable 
{ 
    private Process myProcess = null; 

    ~MyProcess() 
    { 
     Dispose(false); 
    } 

    public void Dispose(bool dispose) 
    { 
     Dispose(); 
    } 

    public void Dispose() 
    { 
     if (myProcess != null) 
     { 
      if (!myProcess.HasExited) 
       myProcess.Kill(); 
      myProcess.Dispose(); 
      myProcess = null; 
     } 
    } 

    public bool LaunchProcess() 
    { 
     try 
     { 
      myProcess = new Process(); 
      myProcess.StartInfo.UseShellExecute = false; 
      myProcess.StartInfo.FileName = "C:\example.bat"; 
      myProcess.StartInfo.CreateNoWindow = true; 
      myProcess.Start(); 
      return true; 
     } 
     catch (Exception e) 
     { 
      myProcess.Dispose(); 
      Console.WriteLine(e.Message); 
     } 
     return false; 
    } 
} 

Это должно гарантировать, что этот процесс не переживет свою собственную программу.

Смежные вопросы