2012-06-26 60 views
0

我希望你能帮助我。当我想执行这些.bat文件时,我可以看到这些文件已被执行,但我只能得到第一个,第二个或其他我无法获取的文件,我对我的批处理文件没有问题,我试图一个接一个地执行它们,它的工作原理。执行多个批处理文件c#

string str_Path = Server.MapPath(".") + "\\execute.bat"; 
string str_PathN= Server.MapPath(".") +"\\executeN.bat"; 
string str_PathHD = Server.MapPath(".") + "\\executeHD.bat"; 
string str_PathFHD = Server.MapPath(".") + "\\executeFHD.bat"; 

ProcessStartInfo processInfo = new ProcessStartInfo(str_Path); 
processInfo.UseShellExecute = false; 
Process batchProcess = new Process(); 
batchProcess.StartInfo = processInfo; 
batchProcess.Start(); 
Thread.Sleep(3000); 

ProcessStartInfo hd = new ProcessStartInfo(str_PathHD); 
hd.UseShellExecute = false; 
Process batchProcessHD = new Process(); 
batchProcessHD.StartInfo = processInfo; 
batchProcessHD.Start(); 
Thread.Sleep(3000); 
... 
+1

你可以创建一个执行他们的所有的休息,只是运行一个单一的批处理文件?可能会减少工作。 – Bridge

+2

你是什么意思'我不能让他们'?不应该为'batchProcessHD.StartInfo = processInfo'分配'hd'吗? – dtsg

+0

@Duane看起来就是这样的答案 - 为什么不把它贴出来呢? “复制和粘贴”编程的危险。 – Bridge

回答

2

你为什么不

public static void runBatch(string path, int sleepTime = 3000) 
{ 
    ProcessStartInfo psi = new ProcessStartInfo(path); 

    psi.UseShellExecute = false; 

    Process proc = new Process(); 
    proc.StartInfo = psi; 

    proc.Start(); 
    Thread.Sleep(sleepTime); 
} 


main() 
{ 
    runBatch(Server.MapPath(".") + "\\execute.bat"); 
    runBatch(Server.MapPath(".") +"\\executeN.bat"); 
... 
} 

还是一个更好的版本runBatch的:

public static void runBatch(string path) 
{ 
    ProcessStartInfo psi = new ProcessStartInfo(path); 

    psi.UseShellExecute = false; 

    Process proc = new Process(); 
    proc.StartInfo = psi; 

    proc.Start(); 
    proc.WaitForExit(); 
} 
+0

你有没有尝试从你的CMD写入日志?他们被执行了吗? –

+0

另外,检查Process.Start的返回值..它是否返回true? –

+0

也会在WaitForExit –

1

您可以通过使用简化代码:

public void ExecuteBatFiles(List<string> path, int time) 
    { 
     foreach(string location in path) 
     { 
      ProcessStartInfo processInfo = new ProcessStartInfo(location); 
      processInfo.UseShellExecute = false; 
      Process batchProcess = new Process(); 
      batchProcess.StartInfo = processInfo; 
      batchProcess.Start(); 
      Thread.Sleep(time); 
     } 
    } 

如果您只是想一个接一个地关闭。但看起来应该指定batchProcessHD.StartInfo = processInfo代替hd

1

对C#来说,你显然很新,但对你的困境理解有限,这是另一种方式。

请注意,所有答案都避免了为该过程重复同一个设置代码块。

如果您复制并粘贴了您遇到的问题,无法进行所有需要的编辑,并且引入了一个需要敏锐目光挑选的错误。

程序员努力只编写一次代码,以避免上述问题,因此如果发现该代码被窃听并稍后修复,一旦在整个应用中解决该问题,就修复它。显然,它可以节省时间,不必一遍又一遍地写同样的东西。

原理是所谓的干,你可以在这里阅读更多关于它:

http://en.wikipedia.org/wiki/Don%27t_repeat_yourself

private static void Run() 
    { 
     var processes = CreateBatchOfProcesses("execute.bat", "executeN.bat", "executeHD.bat", "executeFHD.bat"); 
     foreach (Process p in processes) 
     { 
      p.Start(); 
      p.WaitForExit(); 

      // Do other stuff with the process. 
     } 
    } 

    private static List<Process> CreateBatchOfProcesses(params string[] paths) 
    { 
     var batch = new List<Process>(paths.Length); 

     foreach (string path in paths) 
     { 
      string mappedPath = Server.MapPath(String.Concat(".\\", path)); 
      ProcessStartInfo info = new ProcessStartInfo(mappedPath); 
      info.UseShellExecute = false; 
      Process process = new Process(); 
      process.StartInfo = info; 

      batch.Add(process); 
     } 

     return batch; 
    }