Как получить результат командного файла на C # - PullRequest
0 голосов
/ 01 июня 2018

В настоящее время я пытаюсь перенести существующие данные в пакетном файле в форму окна C #

Вся цель - получить живой результат из пакетного файла в текстовое поле C #, но я продолжаю терпеть неудачу в этом.

Процедура работает так же, как нажатие кнопки-> тайно запустить пакетный файл-> C # возвращает данные в реальном времени-> отобразить в текстовом поле

Мне удалось запустить пакетный файл, но он запускается в другомновая CMD, вызывающая проблемы с зависанием во время отладки.

Я хотел бы знать, может ли кто-нибудь написать мне код для преодоления такой проблемы.Надежда на лучший ответ

        ProcessStartInfo cmd = new ProcessStartInfo();
        Process process = new Process();
        cmd.FileName = @"cmd";

        cmd.UseShellExecute = false;
        cmd.RedirectStandardError = true;
        cmd.RedirectStandardInput = true;
        cmd.RedirectStandardOutput = true;
        cmd.CreateNoWindow = true;

        process.EnableRaisingEvents = false;
        process.StartInfo = cmd;
        process.Start();
        process.StandardInput.Write(@"cd C:\Users\%username%\Desktop\Claymore's Dual Ethereum+Decred_Siacoin_Lbry_Pascal AMD+NVIDIA GPU Miner v11.0" + Environment.NewLine);
        process.StandardInput.Write(@"EthDcrMiner64.exe -allpools 1 -epool asia1.ethereum.miningpoolhub.com:20535 -ewal AJStudio.AJStudio001 -epsw x -esm 2" + Environment.NewLine);
        process.StandardInput.Close();

        string result = process.StandardOutput.ReadToEnd();
        StringBuilder sb = new StringBuilder();
        sb.Append("[result info]" + DateTime.Now + "\r\n");
        sb.Append(result);
        sb.Append("\r\n");

        richTextBox1.Text = sb.ToString();
        process.WaitForExit();
        process.Close();

1 Ответ

0 голосов
/ 01 июня 2018

Чтобы получить обратную связь от Process в режиме реального времени, используйте события OutputDataReceived и ErrorDataReceived.Как то так:

process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;

process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;

process.OutputDataReceived += Process_OutputDataReceived;
process.ErrorDataReceived += Process_ErrorDataReceived;

process.Start();

process.BeginOutputReadLine();
process.BeginErrorReadLine();

process.WaitForExit();

private void Process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    if (e.Data == null) return;
    log("ERROR: " + e.Data);
}

private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    if (e.Data == null) return;
    log(e.Data);
}
...