Изначально Windows PowerShell (как и командная строка cmd) сохраняет историю выполненных команд только в текущей сессии PowerShell, при закрытии окна консоли PowerShell или перезагрузке компьютера, история команд PowerShell которые вы набирали нигде не сохраняется. По сравнению с той же bash это является существенным недостатком. В версии PowerShell v5, представленной в Windows 10 этот недостаток был исправлен.
История команд в PowerShell 5.0, модуль PSReadLine
Допустим, вы набрали и выполнили какую-то сложную команду PowerShell. В Windows 10 и Windows Server 2016 даже после перезагрузки компьютера вы можете открыть новую сессию PowerShell и нажать клавишу со стрелкой вверх. На экране должна отобразить последняя введенная вами команда. Если продолжить нажать клавишу «вверх» — вы увидите все команды, выполненные ранее. Таким образом с помощью клавиш «вверх» и «вниз» вы можете прокручивать историю команд и повторно выполнять ранее набранные команды.
Можно вывести более подробную информацию о ранее выполненных командах, в том числе статуса и времени запуска/окончания выполнения команды:Get-History | Format-List -Property *
Оболочка PowerShell в Windows 10 по-умолчанию запоминает последние 4096 команд, которые сохраняются в текстовом файле, расположенном в профиле каждого пользователя
%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
. История ведется отдельно для консоли PowerShell, отдельно для ISE.
В том случае, если вы не хотите пролистывать всю историю команд PowerShell, вы можете выполнить поиск по истории команд с помощью комбинации клавиш CTRL+R (поиск в обратном направлении) и CTRL+S (поиск вперед). Нажмите сочетание клавиш и начните вводить часть команды, которую вы хотите найти в ранее выполненных командах. В истории команд будет выполнен поиск введенного текста на любой позиции (в отличии от поиска в консоли PowerShell по F8 или Shift+F8, которые ищут совпадения только с начала строки) и подсвечен подходящий вариант.
Install-Module PSReadLine
Полный список функций модуля PSReadLine для управления историей выполнения команд в PowerShell и привязанных к ним клавишам можно вывести командой:
Get-PSReadlineKeyHandler | ? {$_.function -like '*hist*'}
Key Function Description
--- -------- -----------
Key Function Description
--- -------- -----------
UpArrow PreviousHistory Заменить введенные данные предыдущим элементом журнала
DownArrow NextHistory Заменить введенные данные следующим элементом журнала
Ctrl+R ReverseSearchHistory Выполнить интерактивный поиск по журналу в обратном направлении
Ctrl+S ForwardSearchHistory Выполнить интерактивный поиск по журналу в направлении вперед
Alt+F7 ClearHistory Удалить все элементы из журнала командной строки (не из журнала PowerShell)
F8 HistorySearchBackward Искать предыдущий элемент журнала, который начинается с текущего ввода, например P...
Shift+F8 HistorySearchForward Искать следующий элемент журнала, который начинается с текущего ввода, например Ne...
Unbound ViSearchHistoryBackward Запускает новый поиск по журналу в направлении назад.
Unbound BeginningOfHistory Перейти к первому элементу журнала
Unbound EndOfHistory Перейти к последнему элементу (текущий ввод) в журнале
Настройка истории команд выполняется при помощи командлетов Get-PSReadlineOption и Set-PSReadlineOption. Текущие настройки можно получить с помощью такой конструкции:
Get-PSReadlineOption | select HistoryNoDuplicates, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle
Нам могут быть интересны настройки следующих параметров:
- HistoryNoDuplicates – нужно ли сохранять в истории PowerShell одинаковые команды;
- MaximumHistoryCount – максимальное число сохраненных команд (по умолчанию сохраняются 4096 команд);
- HistorySearchCursorMovesToEnd — нужно ли переходить в конец команды при поиске;
- HistorySearchCaseSensitive – нужно ли учитывать регистр при выполнении поиска;
- HistorySavePath – путь к текстовому файлу, в который сохраняется история команд PowerShell;
- HistorySaveStyle – особенности сохранения команд:
- SaveIncrementally — команды сохраняются при выполнении (по-умолчанию)
- SaveAtExit — сохранение истории при закрытии консоли
- SaveNothing — отключает ведение истории команд
Изменить настройки модуля PSReadLine можно с помощью команды Set-PSReadlineOption, например:
Set-PSReadlineOption -HistorySaveStyle SaveAtExit
Таким образом, возможность сохранения истории выполненных команд в PowerShell 5.0 — это еще один аргумента отказа от cmd в пользу консоли PoSh.
Очистка истории команд в PowerShell
Как мы рассказали выше, модуль PSReadline сохраняет все консольные команды PowerShell в текстовый файл. Однако в некоторых случаях администратору приходится вводить в консоли PowerShell различную конфиденциальную информацию (учетки, пароли, адреса, персональные данные и т.д.). Таким образом другой администратор сервера или атакующий может получить доступ к данным в текстовом файле. В целях безопасности вам может понадобиться очистить журнал выполненных команд PowerShell или совсем отключить историю команд.
Командлет Clear-History
использовать для очистки истории команд нельзя, т.к. он очищает только список предыдущих команд, которые выводит командлет Get-History.
Чтобы удалить историю предыдущих команд PoSh, нужно удалить файл, в который они сохраняются. Проще всего это сделать командой:
Remove-Item (Get-PSReadlineOption).HistorySavePath
После этого закройте сессию PoSh:
Если нужно полностью отключить сохранение истории команд PoSh в текстовый файл, выполните команду:
Set-PSReadlineOption -HistorySaveStyle SaveNothing
Импорт истории команд PowerShell в другую сессию
В некоторых случаях бывает удобно иметь под рукой один и то те список часто-используемых команд PowerShell на различных компьютерах. Вы можете экспортировать текущую историю команд в xml файл и импортировать их на других компьютерах. Это можно сделать, скопировав файл ConsoleHost_history.txt в профили пользователей на нужных компьютерах.
Также для экспорта команд из текущей сессии в файл можно использовать командлет Export-Clixml:
Get-History | Export-Clixml -Path c:\ps\commands_hist.xml
Для импорта команд из файла в сессию PoSh:
Add-History -InputObject (Import-Clixml -Path c:\ps\commands_hist.xml)
Для автоматического импорта команд в файл при завершении сессии PoSh, можно привязать скрипт к событию завершения сессии PoSh (!! Сессия обязательно должна завершаться командной exit, а не простым закрытием окна PoSh):
$HistFile = Join-Path ([Environment]::GetFolderPath('UserProfile')) .ps_history
Register-EngineEvent PowerShell.Exiting -Action { Get-History | Export-Clixml $HistFile } | out-null
if (Test-path $HistFile) { Import-Clixml $HistFile | Add-History }
Есть ли способ сохранить историю команд cmd?
Нет. В cmd история команд хранится только в текущей сессии. Список предыдущих команд доступен по F7.