Есть ли глобальная, постоянная история CMD?

Иногда я забываю, как выглядит точный синтаксис команды CMD, и тогда я хотел бы искать свою собственную историю CMD. Очевидно, что в рамках одного сеанса вы можете просматривать его с помощью клавиш со стрелками вверх и вниз, но как насчет истории предыдущих сеансов CMD? Есть ли файл, журнал, в который записывается история, или все это идет в цифровую нирвану?

Спасибо!

12 ответов

Решение

Нет, историю командной строки Windows нельзя сохранить после завершения сеанса.

Не изначально, но посмотрите: http://mridgers.github.io/clink/, делает cmd.exe гораздо более продуктивным. Цитирование функций со страницы проекта:

Powerful Bash-like line editing from GNU's Readline library.
Superior path completion (TAB).
Paste from clipboard (Ctrl-V).
Support for the completion of executables/commands, and environment variables.
Undo/Redo (Ctrl-_ or Ctrl-X, Ctrl-U)
Improved command line history.
Persists across sessions.
Searchable (Ctrl-R and Ctrl-S).
History expansion (e.g. !!, !<string>, and !$).
Scriptable completion using Lua.

Массимо прав, что история вашей командной строки не сохраняется между сеансами. Вы можете вручную захватить это перед закрытием вашего приглашения, набрав doskey /history > history.txt

Или... вы можете использовать PowerShell в качестве приглашения CMD и следовать этому посту, чтобы сохранить свою историю между сеансами.

Вы можете использовать клинк.

Clink сочетает в себе встроенную оболочку Windows cmd.exe с мощными функциями редактирования командной строки библиотеки GNU Readline, которая обеспечивает богатые возможности завершения, истории и редактирования строк.

Самым простым способом установки клинка является использование шоколада. После установки Chocolatey вы можете установить clink, набрав

choco install clink

Начиная со следующего запуска cmd.exe, он должен хранить историю между сеансами.

Можно сохранить текущую историю в файл,

`$ doskey /history > somefile.txt`

Но, похоже, нет способа загрузить его обратно в историю. Можно использовать только аргумент командной строки для загрузки и выполнения всех строк,

cmd.exe /K somefile.txt

, что может быть полезно для загрузки списка макросов doskey. Этот вызов может быть включен в ярлык, поэтому вам не нужно вводить его каждый раз; эта ссылка имеет некоторую дополнительную информацию об этом подходе.

Существует аналогичный вопрос о Superuser, который предлагает некоторые альтернативы, в том числе clink, как предложено @RobertBak.

Да, это возможно

Если все, что вам нужно, — это сохранять историю командной строки в конце каждого сеанса, вот простой способ сделать это:

Как указывали другие ответы,doskeyпозволяет вам просмотреть историю командной строки для текущего сеанса. Он также позволяет создавать макросы.

Этот простой макрос сохранит историю командной строки при выходе из сеанса:

      doskey exit=(echo/ ^& echo **** %date% %time% ****) $g$g %USERPROFILE%\commands.log ^& doskey /history $g$g %USERPROFILE%\commands.log ^& ECHO Command history saved, exiting ^& exit $*

Это создает макрос, который переназначаетEXITКоманда для копирования истории командной строки в папку вашего профиля пользователя (например,C:\Users\yourname\commands.log). К сожалению, вы не сможете легко вернуться к любой из этих записей, нажав стрелку вверх, но вы можете в любой момент просмотреть файл и узнать, что вы делали раньше.

Автозагрузка

Так что это самая легкая часть. Сложная часть — это автоматическая загрузка этого макроса doskey при запуске нового командного сеанса. Короткий и опасный ответ — просто добавить его в РЕЕСТР в формате . Все, что вы поместите в эту запись, будет запущено при запуске сеанса.

Хотя это и сработает, это определенно создаст неожиданные побочные эффекты при выполнении любого сценария*.

Итак, вот как я это делаю:

Создайте файл с именем и сохраните его в папке своего профиля (например,C:\Users\yourname\autoexec.bat). Затем измените значениеHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRunк этому:

      IF EXIST "%USERPROFILE%\autoexec.bat" (CALL "%USERPROFILE%\autoexec.bat")

Так что да, этот пакетный файл будет запускаться каждый раз при открытии сеанса, но мы сделаем трюк, чтобы убедиться, что он не запускается ни в каких подпроцессах. Вот что вы положили вautoexec.batфайл:

      @echo off
if "%AUTOEXEC%" EQU "1" goto :eof
SET AUTOEXEC=1
echo Loading macros.

rem  remap exit command to save a copy of the command line history to a log before exiting.
DOSKEY exit=(echo/ ^& echo **** %date% %time% ****) $g$g %USERPROFILE%\commands.log ^& doskey /history $g$g %USERPROFILE%\commands.log ^& ECHO Command history saved, exiting ^& exit $*

Как это позволяет избежать неожиданных побочных эффектов?

Все, что мы делаем, это создаем переменную среды с именемAUTOEXEC. Тогда, когда любые последующие подпроцессы откроют командную сессию, они убегут на вторую строку и сразу же выйдут из скрипта! Это связано с тем, что подпроцессы автоматически наследуют переменные среды родительского процесса.

Но подождите, это еще не все!

Это позволяет вам добавлять в сеанс команд столько макросов, сколько вы хотите. Например:

      rem  review previous command line entries:
DOSKEY history=notepad %USERPROFILE%\commands.log

rem  copy the current directory to the clipboard
DOSKEY cc=cd^|clip ^& echo %%CD%% copied to clipboard

rem  etc!

Теперь у вас есть все макросы, которые вы можете использовать, и вы каждый раз сохраняете сеанс командной строки. Но помните: если вы не введете явноexit, история не будет сохранена. Закрыть окно мышкой здесь не получится.

Надеюсь это поможет!

* поскольку пакетные подпроцессы часто открывают вторую копиюCMDкоторый будет запускать эту команду снова и снова, от замедления всего до других непредвиденных проблем.

Я предлагаю использовать Cygwin с терминалом Windows. Возможно, это не совсем то, что вам нужно, но меня это вполне устраивает. Вероятно, у него также есть некоторые проблемы, которые я еще не обнаружил.

Вы можете интегрировать Cygwin с терминалом Windows и использовать с ним оболочку ZSH, чтобы иметь рабочую историю команд, которая сохраняется при закрытии окна терминала. Вы также можете выполнить обратный поиск в истории команд с помощью Ctrl+ R. Поскольку вы используете ZSH, вы также можете установить полезные вещи, такие как Oh My Zsh, а также такие плагины, какzsh-autosuggestionsиzsh-syntax-highlightingчтобы облегчить жизнь.

Моя установка выглядит так:

  1. Как только вы установите Cygwin наC:/cygwin64/интегрируйте его с терминалом Windows, отредактировав его файл. Для этого откройте Терминал Windows и нажмите Ctrl+ Shift+ ,(запятая). Файл должен открыться в редакторе текста/кода по умолчанию.

  2. Ищитеprofilesраздел и добавьте его в конецlistмножество:

      {
    "colorScheme": "One Half Dark",
    "commandline": "C:/cygwin64/Cygwin.bat",
    "guid": "{00000000-0000-0000-0000-000000000001}",
    "hidden": false,
    "icon": "C:/cygwin64/Cygwin.ico",
    "name": "Cygwin",
    "tabColor": "#3CB371"
}

Когда вы закончите, раздел файла должен выглядеть примерно так:

    "профили":
    {
        «по умолчанию»: {},
        "список":
        [
            {
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                «скрытый»: ложь,
                "name": "Windows PowerShell"
            },
            {
                "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
                «скрытый»: ложь,
                "name": "Командная строка"
            },
            {
                "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
                «скрытый»: ложь,
                "name": "Лазурная облачная оболочка",
                "source": "Windows.Terminal.Azure"
            },
            {
                "guid": "{f9ceaf27-504c-58d7-927c-d1d6a7ac7d3c}",
                «скрытый»: ложь,
                "name": "Ubuntu 22.04.1 LTS",
                "source": "CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc"
            },
            {
                "guid": "{17bf3de4-5353-5709-bcf9-835bd952a95e}",
                «скрытый»: правда,
                "имя": "Убунту-22.04",
                "source": "Windows.Terminal.Wsl"
            },
            {
                "colorScheme": "Наполовину темный",
                "командная строка": "C:/cygwin64/Cygwin.bat",
                "guid": "{00000000-0000-0000-0000-000000000001}",
                «скрытый»: ложь,
                "icon": "C:/cygwin64/Cygwin.ico",
                "name": "Сигвин",
                "tabColor": "#3CB371"
            }
        ]
    },
  1. Сохраните файл, откройте терминал Windows, нажмите кнопку ˅и выберите Cygwin или нажмите горячую клавишу, связанную с этим профилем.

  2. Откройте установщик Cygwin и убедитесь, что у вас установлены следующие пакеты: lynx, wget, tar, git, vim.

  3. В терминале Cygwin установитеapt-cygс

      lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin
  1. Теперь устанавливаем ZSH
      apt-cyg install zsh
  1. Если хотите, вы можете установить Oh My Zsh вместе с плагинами zsh-autosuggestions и zsh-syntax-highlighting . Убедитесь, что вы настроили свой~/.zshrcфайл, чтобы эти плагины были включены.
      git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
  1. Последним шагом является создание нового.batфайл, который будет вызываться при выборе терминала Cygwin в терминале Windows. Создайте новый файл в этом месте:C:/cygwin64/Cygwin-ZSH.batа затем вставьте в него следующее:
      @echo off
setlocal enableextensions
set TERM=
cd /d "%~dp0bin" && .\zsh --login -i
  1. Откройте терминал Windowssettings.jsonфайл и измените запись профиля Cygwin , чтобы использовать новыйCygwin-ZSH.batфайл для терминала Cygwin (см. шаг 2)
{
    "colorScheme": "Наполовину темный",
    "командная строка": "C:/cygwin64/Cygwin-ZSH.bat",
    "guid": "{00000000-0000-0000-0000-000000000001}",
    «скрытый»: ложь,
    "icon": "C:/cygwin64/Cygwin.ico",
    "name": "Сигвин",
    "tabColor": "#3CB371"
}
  1. Если хотите, сделайте Cygwin профилем по умолчанию, который будет использоваться при каждом запуске терминала Windows. Для этого откройте терминал Windows, нажмите Ctrl+,(запятая), чтобы открыть страницу настроек , и в разделе «Профиль по умолчанию» выберите Cygwin .

Вот и все. У вас должен быть доступ к командам, которые вы вводили ранее (после того, как профиль Cygwin был установлен и установлен по умолчанию) с помощьюhistoryкомандуйте сейчас.

При первом запуске терминала Cygwin загрузка занимает некоторое время, но все новые окна/вкладки терминала, запущенные после этого, загружаются быстро.


Большое спасибо из этих статей, где я узнал об этом:

  1. https://dev.to/vuong/let-s-add-cygwin-into-windows-terminal-and-customize-it-for-development-looks-1hp8
  2. https://medium.com/@alllexsm/how-to-install-z-shell-zsh-on-cygwin-dd9ee380d783

История команд. Чтобы включить историю команд (доступ к которой можно получить с помощью клавиш со стрелками вверх и вниз), просто введите doskey в командной строке. Например, чтобы создать историю команд из 100 элементов:

doskey /listsize=100

ссылка: https://users.cs.jmu.edu/bernstdh/web/common/help/ntshell.php

clink хорош, и автор публикует шоколадный пакет на каждом выпуске, однако я бы предложил DeepBlueCLI.

Вы можете использовать https://github.com/sans-blue-team/DeepBlueCLI для настройки идентификатора события безопасности Windows 4688.

Для PowerShell DeepBlueCLI также использует ведение журнала модулей (событие PowerShell 4013) и ведение журнала сценариев (4104). Он не использует транскрипцию.

Дополнительным преимуществом является то, что он регистрирует хэш командной строки exe в журнале событий AppLocker. Источник: https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/manage/component-updates/command-line-process-auditing

Кроме того, поскольку в этом решении используется инфраструктура журнала событий Windows, вы можете запросить ее через WMI или PowerShell. Get-EventLog, С помощью clink вы должны изучить другой инструмент, чтобы выявлять системные или сетевые модели поведения.

вы также можете установить tabby (https://tabby.sh/). или используйте (Get-PSReadlineOption).HistorySavePath

Чтобы сохранить историю команд:

doskey /history > history.dos

Для ссылки на команды:

cls & type history.dos | find /v /n ""

Этот метод не изменит историю команд текущего сеанса

Чтобы добавить историю команд текущего сеанса в последний файл сохранения:

doskey /history >> history.dos

Windows 10 теперь включает альтернативные и улучшенные оболочки («терминалы», как их называют).

  1. Терминал Windows, кажется, я установил его через встроенный магазин. После установки просто нажмите «Пуск» и найдите «Терминал» или выполните «Пуск»> «Выполнить»> «wt». Сюда входит постоянная история команд.
  2. Оболочка Ubuntu. Вы можете установить подсистему Windows для Linux и Ubuntu, обе они доступны из встроенного магазина. Если вы знаете Unix, то очень удобно иметь доступ ко всем обычным утилитам и синтаксису bash, и, конечно же, история команд сохраняется.
Другие вопросы по тегам