总是有一种方法可以使用C#控制台应用程序来读取CMD输出,就像上面提到的那样并询问这个线程:How to parse command line output from c#?
但是,我需要的是前一个问题的反之亦然,我想创建一个控制台应用程序(无论是在C#中还是在Vb中 - 无关紧要),它将返回一个外部程序(如cmd)可读的输出 . 可执行程序 .
我希望我能做到这么简单:
class Program
{
static DataTable Main(string[] args)
{
// do some stuff
return myDataTable; //(or String)
}
}
但没有运气 .
2 回答
由于注释状态读取控制台窗口的内容非常混乱 . 为什么不将控制台输出重定向到文件(如果愿意,还可以将控制台重定向),然后解决方案变得微不足道 .
This article描述了如何使用自定义跟踪/控制台侦听器/ Logger ,主要是通过扩展TextWriter并设置Console.Out流 .
您是否考虑过使用Windows PowerShell而不是Cmd.exe? PowerShell能够对.NET或COM等对象进行操作,而不像Cmd.exe那样仅限于纯文本 . 因此,您根本不需要担心输出 - 您只需编写类,然后直接从PowerShell使用它们 . 例如,你可以这样做:
如您所见,可以轻松地创建对象并从PowerShell调用其方法和属性 . 这是PowerShell现在是Microsoft的主要管理界面的原因之一 . 从命令行界面处理对象的能力非常强大,PowerShell非常值得一看 .
但是,如果这不可能,那么通过简单地写入控制台,您可以使用cmd.exe获得更多功能 .
在控制台应用程序中,总有三个可用流,称为
stdin
,stdout
和stderr
('standard input','standard output'和'standard error') .stdout
通常连接到显示器,stdin
通常连接到键盘输入,因此默认情况下,控制台应用程序从键盘输入并将输出写入显示器 . 但是,可以将流重定向到文件或从文件重定向,或直接重定向到另一个程序 .>
字符将stdout
重定向到文件 . 从而,将输出写入myfile.txt而不是显示 .
同样,输出可以直接“管道”到另一个程序,如:
中间的管道(
|
)字符将dir
从dir
命令直接连接到more
命令的stdin
,因此数据直接在两个程序之间流动 . 请注意,dir仍然只是写入控制台,它不一定知道它的输出已被重定向 .使用上述技术之一,结合序列化,您可以安排在命令行应用程序之间传递数据 . 您必须安排以两种程序都能理解的格式序列化您的数据,并使用XML或JSON等格式使生活更轻松是明智的,因为它比纯文本更容易反序列化 .