Выполнить BATCH скрипт в памяти программ - PullRequest
2 голосов
/ 05 июня 2011

В настоящее время я столкнулся с проблемой, мне нужно выполнить пакетный скрипт в памяти программ (чтобы не нужно было извлекать пакетный файл во временную папку).

Я открыт для решенийв C # и C ++

Любая помощь будет оценена

Ответы [ 4 ]

5 голосов
/ 05 июня 2011

cmd.exe не будет запускать скрипт из памяти вашего процесса.Опции, которые кажутся мне наиболее очевидными:

  1. Снимите ограничение, которое останавливает извлечение сценария во временный файл.
  2. Сжатие сценария в одну строку и использование cmd.exe /C выполнить его.Вам нужно будет использовать разделитель команд &&.
  3. Создать собственный интерпретатор командных команд.
  4. Использовать другой язык сценариев.

Опции 3 и4 на самом деле не очень привлекательны!Вариант 1 выглядит довольно хорошо для меня, но я не знаю, что приводит к вашему ограничению.

4 голосов
/ 05 июня 2011

Откройте канал в командной оболочке и запишите код программы в этот канал. Вот пример: http://support.microsoft.com/default.aspx?scid=kb;en-us;190351

2 голосов
/ 12 декабря 2012

В 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++]);
               }
           }
1 голос
/ 05 июня 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...