【问题标题】:Write to command line if application is executed from cmd如果从 cmd 执行应用程序,则写入命令行
【发布时间】:2013-08-26 03:22:03
【问题描述】:

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

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

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

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

编辑:因为我使用控制台应用程序,解决方案是 Console.WriteLine 它对我不起作用,因为我的应用程序需要管理员权限(通过清单文件)并且以普通用户权限调用。在这种情况下,UAC 请求权限并使用应用程序打开一个新的 Cmd。

【问题讨论】:

  • 了解Console.WriteLine 方法。 dotnetperls.com/console-writeline
  • 这是我尝试的第一件事,但这显示了另一个控制台并且不写入调用 cmd...
  • 废话。你能带一些截图来展示你的情况吗?两张截图就够了。控制台输出不应创建另一个窗口\进程。
  • 对不起,你是绝对正确的。这是 Application.Manifest 文件的原因,它需要管理员权限。因为它是用普通权限调用的,所以 UAC 要求管理员权限并打开一个新的 admincmd...

标签: c# console cmd


【解决方案1】:

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

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

不可能两者兼有。如果您希望它像 windows exe 一样正常工作,那么您必须将其编译为 windows exe,这意味着不:它不会正常写入控制台。尝试从 Windows exe 获取对控制台的访问权限是很棘手的,并且需要对操作系统进行 P/Invoke。

如果它被标记为控制台 exe,那么只需 Console.WriteLine 就可以正常工作。

【讨论】:

    【解决方案2】:

    更好的解决方案: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 世界中一些如此纯粹和自然的概念的一些无用的微软复杂化。如果您的应用程序是从可视启动器(图标、nautilus..)启动的,则输出将丢失。您可以从控制台启动您的应用程序,并将其获取到控制台中。如果需要,您可以重定向输出,这一切都在逻辑上重叠且功能强大。对于微软...它臃肿且妨碍了所有人。

    【讨论】:

    • 谢谢,好主意 :)
    • 很好的解决方案,谢谢。但是对于像我这样没有意识到 DLLImport 位进入 Program 类声明的人来说。否则你会得到很多无用的编译错误!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多