总有一种方法可以使用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)
}
}
但没有运气。
答案 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获得更多功能。
在控制台应用程序中,始终有三个可用的流,称为stdin
,stdout
和stderr
(“标准输入”,“标准输出”和“标准错误”)。 stdout
通常连接到显示器,stdin
通常连接到键盘输入,因此默认情况下,控制台应用程序从键盘输入并将输出写入显示器。但是,可以将重定向到/从文件重定向到,或直接到另一个程序。
>
个字符将stdout
重定向到文件。因此,
dir > myfiles.txt
将输出写入myfile.txt而不是显示。
同样,输出可以直接“管道”到另一个程序,如:
dir | more
中间的管道(|
)字符将stdout
命令中的dir
直接连接到stdin
命令的more
,因此数据直接流两个节目之间。请注意,dir仍然只是写入控制台,它不一定知道它的输出已被重定向。
使用上述技术之一,结合序列化,您可以安排在命令行应用程序之间传递数据。您必须安排以两种程序都能理解的格式序列化数据,并使用XML或JSON等格式使生活更轻松,因为它比纯文本更容易反序列化。