如果从cmd执行应用程序,则写入命令行

时间:2013-08-23 06:53:48

标签: c# console cmd

我搜索了网络和Stackoverflow,我没有找到任何东西。 如果这个问题已经存在,我很抱歉。

如果通过cmd调用我的C#应用​​程序,例如:

  

C:\ System32 \ MyConsoleApplication -parmOne -paramTwo ...

有没有办法写入cmd(例如提供进度信息?)

编辑:因为我使用了一个Console应用程序解决方案ist Console.WriteLine它不适合我,因为我的应用程序需要管理员(通过Manifest文件)并且使用普通用户权限调用。在这种情况下,UAC要求权限并使用该应用程序打开一个新的Cmd。

2 个答案:

答案 0 :(得分:8)

更好的解决方案:http://www.nerdyhearn.com/blog/157/

这是网站的代码:

[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
private const int ATTACH_PARENT_PROCESS = -1;

[STAThread]
static void Main(string[] args)
{
  // Enable visual elements just like always
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);

  // Attach to the parent process via AttachConsole SDK call
  AttachConsole(ATTACH_PARENT_PROCESS);   // <-- important point here
  Console.WriteLine("This is from the main program");

  Application.Run(new Form1());
}

您可以在需要的特殊条件下随意使用AttachConsole来电。这样更好,更灵活,不需要您更改应用程序清单。如果它是一个win32应用程序,对你的应用程序有好处。如果它从cmd启动,那么输出将显示为已被删除。

我的观点:这只是一些在Unix世界中如此纯粹和自然的概念的一些无用的微软复杂化。如果您的应用程序是从可视启动器(icon,nautilus ..)启动的,那么输出就会丢失。您可以从控制台启动应用程序,然后将其置于控制台中。你可以根据需要重定向输出,它可以逻辑地重叠并且功能强大。随着微软......它臃肿并阻碍了每个人。

答案 1 :(得分:3)

这一切都取决于exe类型是什么 - 这是PE-header(“exe”shell)中的标志:

  • 如果它被标记为Windows应用程序,它不会获得现有控制台的控制台/输出 - 无论它是如何启动的
  • 如果它被标记为控制台应用,则 获取控制台/输出到现有控制台 - 无论其如何启动

它不可能两者兼而有之。你希望它像正常的Windows exe一样工作,然后你必须编译它作为一个Windows exe,这意味着没有:它不会正常写入控制台。试图从Windows exe获取对控制台的访问权限是棘手的,并且需要P / Invoke到操作系统。

如果 标记为控制台exe,那么Console.WriteLine只会正常工作。