簡體   English   中英

如果從cmd執行應用程序,則寫入命令行

[英]Write to command line if application is executed from cmd

我搜索了網絡和Stackoverflow,我沒有找到任何東西。 如果這個問題已經存在,我很抱歉。

如果通過cmd調用我的C#應用​​程序,例如:

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

有沒有辦法寫入cmd(例如給出進度信息?)

編輯:因為我使用Console.WriteLine應用程序解決方案ist 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啟動,則輸出將顯示為已排除。

我的觀點:這只是一些在Unix世界中如此純粹和自然的概念的一些無用的微軟復雜化。 如果您的應用程序是從可視啟動器(icon,nautilus ..)啟動的,那么輸出就會丟失。 您可以從控制台啟動應用程序,然后將其置於控制台中。 你可以根據需要重定向輸出,它可以邏輯地重疊並且功能強大。 隨着微軟......它臃腫並阻礙了每個人。

這一切都取決於exe類型是什么 - 它是PE-header(“exe”shell)中的標志:

  • 如果它被標記為Windows應用程序,它不會獲得現有控制台的控制台/輸出 - 無論它是如何啟動的
  • 如果它被標記為控制台應用程序,它獲得現有控制台的控制台/輸出 - 無論它是如何啟動的

它不可能兩者兼而有之。 你希望它像正常的Windows exe一樣工作,然后你必須編譯它作為一個Windows exe,這意味着沒有:它不會正常寫入控制台。 嘗試從Windows exe獲取對控制台的訪問權限是棘手的,並且需要P / Invoke到操作系統。

如果它標記為控制台exe,那么只需Console.WriteLine就可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM