2016-03-26 194 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將確保它不會過早地終止批處理文件。其他進程。殺死最有可能的路要走 – 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; 
    } 
} 

這應該確保過程不會活得比自己的程序。