是否可以以编程方式清除控制台历史记录?

时间:2010-07-14 09:46:34

标签: c# console console-application

使用控制台应用程序时,会存储在Console.ReadLine()输入的所有内容的历史记录。在控制台提示输入内容时,按向上/向下光标将滚动浏览此历史记录(按F7可查看整个历史记录)。

使用C#,是否可以禁用此行为或清除已输入的内容的历史记录?


为了澄清,Console.Clear()不清除历史记录,只清除屏幕缓冲区。我想清除命令历史记录。


编辑:尝试了几种建议的方法,以及我自己设计的一些方法,最好的方法是ho1建议的方法。它并不理想,因为它会带来另一个控制台窗口,但它确实清除了历史记录。

6 个答案:

答案 0 :(得分:4)

How can I configure the command line history, DOSKEY?上的这篇文章可以提供帮助吗?

  

在过去的DOS时代,有一个实用程序DOSKEY.EXE,它允许用户循环浏览以前的命令。在NT中,默认情况下启用此功能,您可以循环使用旧命令,但DOSKEY具有其他功能。

     

要清除当前命令行历史记录使用命令:

doskey /reinstall
     

您还可以选择告诉它与/ listsize参数

保持多少旧命令
doskey /reinstall /listsize=50
     

将保留50个旧命令。

请告诉我它是否有效以及您如何使用它:)

答案 1 :(得分:1)

编辑:删除了错误的答案(我对你想做的事感到困惑)并添加了另一个(希望)更好的答案。

可以通过使用FreeConsole释放当前控制台,然后使用AllocConsole分配新控制台来执行此操作。我认为它不会保留命令行历史记录。

一般情况下,如果您想使用.Net Framework不支持的控制台进行操作,则可以在此MSDN页面查看:Console Functions

答案 2 :(得分:1)

看看SetConsoleHistoryInfo。根据文档,它只适用于Vista及以上,所以我不确定它是否会对你有所帮助。

答案 3 :(得分: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;
        }
    }
}

答案 4 :(得分:0)

似乎根据MSN(http://msdn.microsoft.com/en-ie/library/system.console_members.aspx)方法console.clear()“清除控制台缓冲区..”

答案 5 :(得分:0)

您可以尝试使用该属性

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