Можно ли программно очистить историю консоли? - PullRequest
9 голосов
/ 14 июля 2010

При работе с консольным приложением сохраняется история всего, что было введено в Console.ReadLine(). Когда в консоли появляется запрос на ввод чего-либо, нажатие курсора вверх / вниз прокручивает эту историю (и всю историю можно просмотреть, нажав F7).

Используя C #, есть ли способ отключить это поведение или очистить историю того, что уже было введено?


Чтобы уточнить, Console.Clear() не очищает историю, только экранный буфер. Я хочу очистить историю команд.


РЕДАКТИРОВАТЬ: Попробовав несколько из предложенных методов, а также некоторые из моих собственных разработок, лучший подход - тот, который предложил ho1. Он не идеален, потому что он вызывает другое окно консоли, но он очищает историю.

Ответы [ 6 ]

4 голосов
/ 14 июля 2010

Может ли это сообщение на Как настроить историю командной строки, DOSKEY? help?

В старые времена DOS была доступна утилита DOSKEY.EXE, которая включалапользователь циклически перебирает предыдущие команды.В NT это включено по умолчанию, и вы можете переключаться между старыми командами, однако у DOSKEY есть и другие возможности.

Чтобы очистить текущую историю командной строки, используйте команду:

doskey /reinstall

Вы также можете указатьсколько старых команд нужно сохранить с параметром / listsize

doskey /reinstall /listsize=50

сохранит 50 старых команд.

Пожалуйста, дайте мне знать, работает ли он и как вы его использовали :)

1 голос
/ 30 мая 2014

Этот код работает для меня, чтобы очистить историю команд.Ограниченное тестирование и отсутствие гарантий переносимости.

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;
        }
    }
}
1 голос
/ 14 июля 2010

Взгляните на SetConsoleHistoryInfo . Согласно документации, это работает только на Vista и выше, поэтому я не уверен, поможет ли это вам или нет.

1 голос
/ 14 июля 2010

Редактирование: удален неправильный ответ (я запутался в том, что вы хотели сделать) и добавил другой (надеюсь) лучший ответ.

Это можно сделать, освободив текущую консоль с помощью FreeConsole , а затем выделив новую консоль с помощью AllocConsole . Я бы предположил, что тогда он не сохранит историю командной строки.

В общем, если вы хотите что-то сделать с консолью, которая не поддерживается .Net Framework, эта страница MSDN является хорошим местом для поиска: Функции консоли

0 голосов
/ 14 июля 2010

Вы можете попробовать использовать свойство

Console.BufferHeight : "This property defines the number of rows (or lines) stored in the buffer that is accessed by a console mode window"
0 голосов
/ 14 июля 2010

Кажется, согласно MSN (http://msdn.microsoft.com/en-ie/library/system.console_members.aspx) метод console.clear() "Очищает консольный буфер .."

...