Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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#形式运行.Bat_C#_Winapi_Batch File_Cmd - Fatal编程技术网

以C#形式运行.Bat

以C#形式运行.Bat,c#,winapi,batch-file,cmd,C#,Winapi,Batch File,Cmd,我的目标是从C#执行一个外部.bat文件。问题是我必须以我的形式显示执行的BAT的结果,而不是在控制台中。google上的解决方案只向我展示了如何启动bat,而不是如何从控制台获取内容 实现这一点的最佳方法是什么?您可以在Process类中使用StandartOutputEvent: const string BATFILE = "Test.bat"; const bool HIDE = true; static Encoding ENCODING = Encoding.

我的目标是从C#执行一个外部.bat文件。问题是我必须以我的形式显示执行的BAT的结果,而不是在控制台中。google上的解决方案只向我展示了如何启动bat,而不是如何从控制台获取内容


实现这一点的最佳方法是什么?您可以在Process类中使用StandartOutputEvent:

    const string BATFILE = "Test.bat";
    const bool HIDE = true;
    static Encoding ENCODING = Encoding.Default;

    static void Main(string[] args)
    {
        System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd", BATFILE);

        if (HIDE)
        {
            psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        }

        psi.RedirectStandardOutput = true;
        psi.StandardOutputEncoding = ENCODING;
        psi.UseShellExecute = false;

        System.Diagnostics.Process p = new System.Diagnostics.Process();
        p.StartInfo = psi;
        p.OutputDataReceived += p_OutputDataReceived;

        p.Start();
    }

    static void p_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
    {
        //Do something with a form...
        System.Console.WriteLine(e.Data);
    }

我想你也需要这个:

...                 
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
...

p.Start();

p.checkoutProcess.BeginOutputReadLine();
p.checkoutProcess.BeginErrorReadLine();

检查此选项没有帮助,我希望整个过程都有输出,而不仅仅是在完成后。它必须在bat生成的每一行上进行更新。您可以使用proc.StandardOutput.ReadLine()而不是proc.StandardOutput.ReadToEnd()来读取每一行的输出,这应该会有所帮助。我会尝试一下,如果成功的话会给出回复。为什么要在表单上显示文本输出?它不是为此而设计的。改用控制台窗口。