Как запустить команды командной строки из кода - PullRequest
3 голосов
/ 28 мая 2009

Мне нужно сделать 2 вещи: запустить командный файл (работает нормально) и запустить команду (не работает). Метод команды генерирует исключение «файл не найден». Если я открою окно cmd и наберу команду, она отлично работает.

  private static void Rescan()
    {
        //System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("DEVCON ReScan");
        //psi.RedirectStandardOutput = true;
        //psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        //psi.UseShellExecute = false;
        //System.Diagnostics.Process proc = System.Diagnostics.Process.Start(psi);
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo.FileName = "DEVCON ReScan";
        proc.StartInfo.RedirectStandardError = true;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.UseShellExecute = false;
        proc.Start();
        proc.WaitForExit();
        System.IO.StreamReader myOutput = proc.StandardOutput;
        proc.WaitForExit(4000);
        if (proc.HasExited)
        {
            string output = myOutput.ReadToEnd();
            FileIO.WriteLog(_writePath, output);
        }

    }

Код с комментариями также вызывает то же исключение.

Ответы [ 3 ]

9 голосов
/ 28 мая 2009

DEVCON ReScan действительно имя исполняемого файла? Я предполагаю, что исполняемый файл - DEVCON, а ReScan - это параметр. Это означает, что вы должны установить StartInfo.FileName на «DEVCON» и StartInfo.Arguments на «ReScan».

0 голосов
/ 28 мая 2009

Попробуйте это:

        ProcessStartInfo psi = new ProcessStartInfo();            
        psi.FileName = Environment.GetEnvironmentVariable("comspec");
        psi.CreateNoWindow = true;
        psi.RedirectStandardError = true;
        psi.RedirectStandardInput = true;
        psi.RedirectStandardOutput = true;
        psi.UseShellExecute = false;

        Process p = Process.Start(psi);

        ConsoleColor fc = Console.ForegroundColor;

        StreamWriter sw = p.StandardInput;
        StreamReader sr = p.StandardOutput;

        char[] buffer = new char[1024];
        int l = 0;

        sw.Write("DEVCON ReScan");
        sw.Write(sw.NewLine);

        Console.Write(">> ");

        l = sr.Read(buffer, 0, buffer.Length);

        for (int n = 0; n < l; n++)
            Console.Write(buffer[n] + " ");

        p.Close();
0 голосов
/ 28 мая 2009

Действительно ли приложение DEVCON находится в рабочем каталоге? В противном случае он не будет работать, если вы не укажете полный путь к нему.

Кроме того, вы должны указать расширение, поэтому я полагаю, что вы выбрали бы «Devcon.exe», и укажите параметры не в имени файла, а в параметрах:)

...