2010-07-14 119 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