2011-06-05 27 views
1

我目前面临一个问题,我需要在程序内存中执行批处理脚本(因此它不必将批处理文件提取到临时位置)。在程序内存中执行BATCH脚本

我愿意在C#和解决方案C++

任何帮助,将不胜感激

回答

4

打开一个管道命令shell和程序代码写入该管道。以下是一个示例:http://support.microsoft.com/default.aspx?scid=kb;en-us;190351

+0

有趣的想法。但是这比将脚本解压缩到一个临时文件更简单吗? – Codo 2011-06-05 13:05:30

+4

问题不是简单的问题。问题在于如何在不将代码写入文件的情况下执行此操作。 – ceving 2011-06-05 13:09:47

4

cmd.exe将不会从您的进程的内存中运行脚本。对我来说最明显的选项是:

  1. 放宽停止提取脚本到临时文件的限制。
  2. 将脚本压缩成一行,然后使用cmd.exe /C来执行它。您需要使用命令分隔符&&
  3. 编写您自己的批处理命令解释器。
  4. 使用不同的脚本语言。

选项3和4是不是真的很诱人!选项1对我来说看起来不错,但我不知道是什么导致了你的限制。

+0

关于选项2:命令行的长度是有限的:http://stackoverflow.com/q/3205027/402322 – ceving 2016-08-09 20:59:30

2

在C#这是使用System.Diagnostics程序作业的简便方法。 如何!?

基本上每个批处理命令是一个.exe文件,所以你可以在一个单独的进程启动。

一些代码:

 using System.Diagnostics; 
     static void Main() 
     { 
      Process batch; 

      batch = Process.Start("ping.exe", "localhost"); 
      batch.WaitForExit(); 
      batch.Close(); 

      batch = Process.Start("choice.exe", ""); 
      batch.WaitForExit(); 
      batch.Close(); 

      batch = Process.Start("ping.exe", "localhost -n 10"); 
      batch.WaitForExit(); 
      batch.Close(); 
     } 

如果你不希望在一个单独的进程启动的每一个命令的解决方案是用一个简单的流重定向。

 ProcessStartInfo startInfo = new ProcessStartInfo(); 
      startInfo.FileName = @"cmd.exe"; // Specify exe name. 
      startInfo.UseShellExecute = false; 
      startInfo.ErrorDialog = false; 
      startInfo.RedirectStandardInput = true; 

      // 
      // Start the process. 
      // 
      Process process = Process.Start(startInfo); 


      string[] batchFile = {"ping localhost", "ping google.com -n 10", "exit"}; 

      int cmdIndex = 0; 

      while (!process.HasExited) 
      { 
       if (process.Threads.Count == 1 && cmdIndex < batchFile.Length) 
       { 
        process.StandardInput.WriteLine(batchFile[cmdIndex++]); 
       } 
      }