【问题标题】:cmd Read C# console applicationcmd 读取 C# 控制台应用程序
【发布时间】:2015-08-17 02:09:52
【问题描述】:

总有一种方法可以使用 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)
    }
}

但没有运气。

【问题讨论】:

  • Console.Write/Console.WriteLine 和其他 Console 方法可以让您输出到控制台,但是由于 cmd.exe 是命令行所以它不会“读取” " 任何东西。
  • main() 不能返回像DataTable 这样的复杂对象(我相信它可以返回voidint)。如果您想要一个可由另一个程序读取的复杂对象的输出,请查看序列化。
  • 另存为 XML。很简单。您需要将 DataTable 添加到 Dataset。然后:DataSet ds = new DataSet();数据表 dt = 新数据表(); ds.Tables.Add(dt); ds.WriteXml("文件名", XmlWriteMode.WriteSchema); ds.ReadXml("文件名");
  • 具体来说,我使用 4Dv12 作为程序的最终终点。由于 4Dv12 有很多限制,我使用外部脚本(如 vbs 和 cmd)来扩展我的功能。现在,我有一个要集成到某些程序中的项目,尽管我已经有了替代方案和补丁,但我相信最有效的方法是让 c# 完成整个集成,让 4Dv12 赶上它。如果我可以使用 CMD 读取 C# 控制台输出,那么我也可以直接在 4D 中执行此操作。我忘了提到使用 XML 是我最后的手段之一。

标签: c# vb.net cmd console


【解决方案1】:

由于 cmets 状态,读取控制台窗口的内容非常令人困惑。你为什么不将你的控制台输出重定向到一个文件(如果你愿意,也可以是控制台),然后解决方案就变得微不足道了。

This article 描述了如何通过扩展 TextWriter 和设置 Console.Out 流来使用自定义跟踪/控制台侦听器/记录器。

【讨论】:

  • 是的,将 csharp_console.exe 控制台的输出重定向到 xml 或 json 文件是我最后的选择。我希望我能做一些类似的事情:C:\\start sharp_console.exe 'someparamter' 在我的 cmd 窗口中返回一条输出消息。 ^_^
【解决方案2】:

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

PS C:\WINDOWS\system32> $list = 新对象 System.Collections.ArrayList PS C:\WINDOWS\system32> $list.Add("第一项") 0 PS C:\WINDOWS\system32> $list.Add("第二项") 1 PS C:\WINDOWS\system32> $list 第一项 第二项 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

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

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

【讨论】:

  • 注意:您要达到的目标并不完全清楚。我已经回答了我认为您正在尝试做的事情,但如果我有误解,请在评论中详细说明,或编辑您的问题,我会更新我的答案以匹配。
  • 是的,谢谢,这也很有帮助。但我更专注于如何读取 C# 控制台输出。类似于:C:\\Start csharp.exe 'todo' 并在我的 cmd 窗口中显示输出消息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
相关资源
最近更新 更多