2010-07-14 148 views
9

使用控制檯應用程序時,存儲了在Console.ReadLine()處輸入的所有內容的歷史記錄。在控制檯提示輸入內容時,按上/下光標將滾動瀏覽歷史記錄(可通過按F7查看整個歷史記錄)。是否可以通過編程清除控制檯歷史記錄?

使用C#,是否有辦法禁用此行爲或清除已輸入內容的歷史記錄?


爲了澄清,Console.Clear()不清除歷史記錄,只有屏幕緩衝區。我想清除命令歷史記錄。


編輯:嘗試過多種的建議的方法,以及一些我自己設計的,最好的辦法是通過一個HO1建議。這並不理想,因爲它帶來了另一個控制檯窗口,但它確實清除了歷史記錄。

回答

1

編輯:刪除不正確的答案(我困惑你想要做什麼),並增加了一個(希望)更好的答案。

使用FreeConsole釋放當前控制檯,然後使用AllocConsole分配新控制檯,可能會這樣做。我假設它不會保持命令行歷史。

一般來說,如果你想要做的事情,這不是由.NET Framework支持的控制檯,這個MSDN網頁是看的好去處:Console Functions

+0

對恐怕的歷史不做任何事情。 – adrianbanks 2010-07-14 11:27:05

+0

@adrianbanks:是的,對你在做什麼感到困惑(儘管至少我犯了一個與這個問題的其他答案不同的錯誤:))。我用另一個可能的解決方案更新了我的答案。 – 2010-07-14 12:11:22

4

請問How can I configure the command line history, DOSKEY?這篇文章有幫助嗎?

在過去的DOS天中,有一個實用程序可用,DOSKEY.EXE,它使用戶能夠循環前面的命令。在NT中這是默認啓用的,您可以循環舊命令,但DOSKEY有其他功能。

要清除當前命令行歷史使用命令:

doskey /reinstall 

您也可以選擇告訴它有多少舊命令跟上/ LISTSIZE參數

doskey /reinstall /listsize=50 

將保持50歲的命令。

請讓我知道,如果它的工作原理,以及如何使用它:)

+0

適用於xp SP3。 – mavnn 2010-07-14 10:00:12

+0

我想從我自己的控制檯應用程序中以編程方式執行此操作,所以我不想依賴於使用外部工具。 – adrianbanks 2010-07-14 10:16:51

+1

如果你想要抑制的功能是由同一個工具提供的,那該怎麼辦? – 2010-07-14 10:31:35

0

你可以試試使用屬性

Console.BufferHeight : "This property defines the number of rows (or lines) stored in the buffer that is accessed by a console mode window" 
+0

我已經試過了,但它不會讓我設置零值。 – adrianbanks 2010-07-14 10:02:43

+0

BufferHeight是所有控制檯輸出的可滾動窗口。這就是爲什麼還有BufferWidth。 – 2010-07-14 10:21:36

1

看看SetConsoleHistoryInfo。根據文檔,它只適用於Vista和更高版本,所以我不確定它是否會對您有所幫助。

1

此代碼正在幫助我清除命令歷史記錄。有限的測試並且不保證可移植性。

public static partial class ConsoleEx 
{ 
    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool SetConsoleHistoryInfo(CONSOLE_HISTORY_INFO ConsoleHistoryInfo); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool GetConsoleHistoryInfo(CONSOLE_HISTORY_INFO ConsoleHistoryInfo); 

    [StructLayout(LayoutKind.Sequential)] 
    private class CONSOLE_HISTORY_INFO 
    { 
     public uint cbSize; 
     public uint BufferSize; 
     public uint BufferCount; 
     public uint TrimDuplicates; 
    } 

    public static void ClearConsoleHistory() 
    { 
     var chi = new CONSOLE_HISTORY_INFO(); 
     chi.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(CONSOLE_HISTORY_INFO)); 

     if (!GetConsoleHistoryInfo(chi)) 
     { 
      return; 
     } 

     var originalBufferSize = chi.BufferSize; 
     chi.BufferSize = 0; 

     if (!SetConsoleHistoryInfo(chi)) 
     { 
      return; 
     } 

     chi.BufferSize = originalBufferSize; 

     if (!SetConsoleHistoryInfo(chi)) 
     { 
      return; 
     } 
    } 
} 
+0

錯誤處理已移除並用返回替換以提高概念示例的可讀性。 – 2014-05-30 05:45:44

+0

這應該是正確的答案。它是C#.NET託管代碼,它封裝了Win32調用來完成你所需要的。像這樣的包裝代碼對於以編程方式到達Win32控制檯功能是必需的,例如切換EOL包裝,將控制檯集中在屏幕上,鎖定窗口更新等。 – delrocco 2016-05-26 14:00:32