从c#执行批处理文件并将结果存储到变量

时间:2017-06-29 17:33:43

标签: c# wpf batch-file invalidoperationexception

我正在编写一个运行批处理文件的程序,并且需要在程序中进一步输出。这是我的C#代码:

public void ExecuteBatFile()
    {
        Process proc = null;
        try
        {

            string targetDir = string.Format("C:\\Users");   //this is where mybatch.bat lies
            proc = new Process();
            proc.StartInfo.WorkingDirectory = targetDir;
            proc.StartInfo.FileName = "batch.bat";
            proc.StartInfo.Arguments = string.Format("10");  //this is argument
            proc.StartInfo.CreateNoWindow = false;
            proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;  //this is for hiding the cmd window...so execution will happen in back ground.
            proc.Start();
            string output = proc.StandardOutput.ReadToEnd();
            Console.WriteLine(output);

            proc.WaitForExit();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString());
        }
    }
}

一旦我跑了,我得到了这个错误:

  

抛出异常:System.dll中的“System.InvalidOperationException”   发生异常:未重定向StandardOut或进程   尚未开始。,at   System.Diagnostics.Process.get_StandardOutput()at   CefSharp.MinimalExample.Wpf.CallBatchFile.ExecuteBatFile()in   C:\ Users \用户CefSharp.MinimalExamplemaster \ CefSharp.MinimalExample.Wpf \ CallBatchFile.cs:线   27

批处理文件成功运行,但后来我无法将结果存储到变量中。无论如何我无法让它工作。有没有人有任何建议? 这是我的moch批次:

@echo off
cd C:\users\934874
echo.>silvio.txt
title This is your first batch script!
echo Welcome to batch scripting!
if "%errorlevel%"=="0" cls &Echo Success.
if "%errorlevel%"=="1" cls &Echo Fail
pause

我期望的输出是在控制台上成功/失败,并将其作为字符串存储到变量中。 在此先感谢您的帮助

2 个答案:

答案 0 :(得分:1)

需要重定向输出

proc.StartInfo.RedirectStandardOutput = true;

https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput(v=vs.110).aspx

引自   https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.useshellexecute(v=vs.110).aspx

当UseShellExecute为false时,不使用WorkingDirectory属性来查找可执行文件。相反,它仅由启动的进程使用,并且仅在新进程的上下文中具有意义。当UseShellExecute为false时,FileName属性可以是可执行文件的完全限定路径,也可以是系统将尝试在PATH环境变量指定的文件夹中查找的简单可执行文件名。

答案 1 :(得分:0)

最简单的方法之一是让批处理文件将其输出写入文本文件。然后您的主程序可以在批处理完成后读取文本文件。

如果您真的想从标准输出流中读取,请查看其他SO帖子: Capturing console output from a .NET application (C#)