cmd阅读C#控制台应用程序

时间:2015-06-03 03:34:03

标签: c# vb.net cmd console

总有一种方法可以使用C#控制台应用程序读取CMD输出,就像上面提到的那样并询问此线程: How to parse command line output from c#?

然而,我需要的是前一个问题的反之亦然,我想创建一个控制台应用程序(无论是在C#中还是在Vb中 - 无关紧要),它将返回一个外部程序可读的输出像cmd.exe。

我希望我能做到这么简单:

class Program
{
    static DataTable Main(string[] args)
    {
        // do some stuff
        return myDataTable; //(or String)
    }
}

但没有运气。

2 个答案:

答案 0 :(得分:1)

由于注释状态读取控制台窗口的内容非常混乱。为什么不将控制台输出重定向到文件(如果愿意,还可以将控制台重定向),然后解决方案变得微不足道。

This article描述了如何使用自定义跟踪/控制台监听器/记录器,主要是通过扩展TextWriter并设置Console.Out流。

答案 1 :(得分:1)

您是否考虑过使用Windows PowerShell而不是Cmd.exe? PowerShell能够对.NET或COM等对象进行操作,而不像Cmd.exe那样仅限于纯文本。因此,您根本不需要担心输出 - 您只需编写类,然后直接从PowerShell使用它们。例如,您可以这样做:

PS C:\WINDOWS\system32> $list = New-Object System.Collections.ArrayList

PS C:\WINDOWS\system32> $list.Add("First item")
0

PS C:\WINDOWS\system32> $list.Add("Second item") 
1

PS C:\WINDOWS\system32> $list 
First item 
Second item

PS C:\WINDOWS\system32> $list.Count 
2

PS C:\WINDOWS\system32>

如您所见,可以轻松地创建对象并从PowerShell调用其方法和属性。这是PowerShell现在是Microsoft的主要管理界面的原因之一。从命令行界面处理对象的能力非常强大,PowerShell值得一看。

但是,如果不是这种可能性,那么通过简单地写入控制台,您可以使用cmd.exe获得更多功能。

在控制台应用程序中,始终有三个可用的流,称为stdinstdoutstderr(“标准输入”,“标准输出”和“标准错误”)。 stdout通常连接到显示器,stdin通常连接到键盘输入,因此默认情况下,控制台应用程序从键盘输入并将输出写入显示器。但是,可以将重定向到/从文件重定向到,或直接到另一个程序。

>个字符将stdout重定向到文件。因此,

dir > myfiles.txt

将输出写入myfile.txt而不是显示。

同样,输出可以直接“管道”到另一个程序,如:

dir | more

中间的管道(|)字符将stdout命令中的dir直接连接到stdin命令的more,因此数据直接流两个节目之间。请注意,dir仍然只是写入控制台,它不一定知道它的输出已被重定向。

使用上述技术之一,结合序列化,您可以安排在命令行应用程序之间传递数据。您必须安排以两种程序都能理解的格式序列化数据,并使用XML或JSON等格式使生活更轻松,因为它比纯文本更容易反序列化。