Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将批处理文件的结果传给C#_C#_Batch File_Cmd_Mining - Fatal编程技术网

如何将批处理文件的结果传给C#

如何将批处理文件的结果传给C#,c#,batch-file,cmd,mining,C#,Batch File,Cmd,Mining,我目前正在努力将批处理文件中的现有数据转换为C#窗口形式 整个目标是获得一个从批处理文件到C#rich文本框的生动结果,但我一直无法做到这一点 该过程的工作原理类似于单击按钮->秘密运行批处理文件->生动地获取数据->在富文本框中显示 我成功地运行了一个批处理文件,但它在另一个新CMD中运行,导致调试期间出现挂起问题 我想知道是否有人能给我写一个代码来克服这个问题。希望得到最好的答案 ProcessStartInfo cmd = new ProcessStartInfo();

我目前正在努力将批处理文件中的现有数据转换为C#窗口形式

整个目标是获得一个从批处理文件到C#rich文本框的生动结果,但我一直无法做到这一点

该过程的工作原理类似于单击按钮->秘密运行批处理文件->生动地获取数据->在富文本框中显示

我成功地运行了一个批处理文件,但它在另一个新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();

要从流程获取实时反馈,请使用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);
}

字面上你应该显示一些代码来复制,这是你的问题。哎呀,我错了,忘记发布代码了。感谢提醒如果在CMD中运行的exe文件启动,程序就像c#->CMD->打开exe文件,不是吗?在本例中,由于代码进程。WaitForExit();表单进入挂起状态,因为EXE程序是加密货币挖掘程序,因此它生成实时数据。很抱歉我不了解,但请帮助在单独的线程中运行该进程的方法-您可以搜索Task.Factory.StartNew或async wait模式。我发现前者在概念上更简单,但主要是品味的问题。对于并行线程,您必须记住的是,您不能直接从非主线程访问GUI对象。因此,在您的代码中,richTextBox1.Text=sb.ToString();分配将产生跨线程冲突错误。要解决这个问题,请查看如何将Invoke和BeginInvoke方法用于跨线程UI更新的示例。