如果从cmd执行应用程序,则写入命令行
本文关键字:命令行 应用程序 cmd 执行 如果 | 更新日期: 2023-09-27 18:28:47
我搜索了web和Stackoverflow,没有找到任何东西。如果这个问题已经存在,我很抱歉。
如果我的C#应用程序是通过cmd调用的,例如:
C: ''System32''MyConsoleApplication-parmOne-parmTwo。。。
有没有一种方法可以写入cmd(例如,提供进度信息?)
编辑:因为我使用的是控制台应用程序,解决方案是Console.WriteLine
。它对我不起作用,因为我的应用程序需要管理员权限(通过Manifest文件),并且是用普通用户权限调用的。在这种情况下,UAC请求权限并使用应用程序打开一个新的Cmd。
更好的解决方案: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启动的,那么输出将显示为excected。
我的观点是:这只是一些无用的微软复杂的概念,这些概念在Unix世界中是如此纯粹和自然。如果您的应用程序是从可视化启动程序(图标,nautilus..)启动的,则输出将丢失。你可以从控制台启动你的应用程序,并在控制台中获取它。如果需要的话,你可以重定向输出,所有的输出都是逻辑性的,而且非常强大。与微软。。。它臃肿,妨碍了所有人。
这一切都取决于exe
类型是什么-它是PE标头("exe"shell)中的标志:
- 如果它被标记为windows应用程序,那么无论它是如何启动的,它都不会获得到现有控制台的控制台/输出
- 如果它被标记为控制台应用程序,那么无论它是如何启动的,它都会向现有控制台获取控制台/输出
不可能两者兼而有之。如果你想让它像windowsexe一样正常工作,那么你就必须把它编译成windowsexe,这意味着不:它不会正常写入控制台。尝试从windowsexe获取对控制台的访问权限是很棘手的,并且需要对操作系统进行P/Invoke。
如果被标记为控制台exe,那么只有Console.WriteLine
可以正常工作。