Просмотр истории предыдущих команд в сеансе PowerShell

Изначально Windows PowerShell (как и командная строка cmd) сохраняет историю выполненных команд только в текущей сессии PowerShell. При закрытии окошка консоли PowerShell или перезагрузке компьютера, история команд PowerShell, которые вы набирали, нигде не сохраняется. По сравнению с той же bash это является существенным недостатком. Начиная с версии PowerShell 5.0, представленной в Windows 10, по-умолчанию все введенные команды в PS консоли теперь сохраняются в текстовый файл журнала.

История команд в PowerShell, модуль PSReadLine

Допустим, вы набрали и выполнили какую-то сложную команду PowerShell. В Windows 10 и Windows Server 2016 даже после перезагрузки компьютера вы можете открыть новую сессию PowerShell и нажать клавишу со стрелкой вверх. На экране должна отобразить последняя введенная вами команда. Если продолжить нажать клавишу «вверх» — вы увидите все команды, выполненные ранее. Таким образом с помощью клавиш «вверх» и «вниз» вы можете прокручивать историю команд и повторно выполнять ранее набранные команды.

В более ранних версиях PowerShell история команд в текущей сессии не сохранялась после ее закрытия. С помощью клавиш вверх/вниз вы можете пролистывать историю команд только текущей сессии PS (можно вывести всю историю команд сессии с помощью командлета Get-History).

Чтобы вывести подробную информацию о ранее выполненных командах в текущей сессии PowerShell, в том числе реи время запуска/окончания выполнения команды:

Get-History | Format-List -Property *

get-history в powershell

Оболочка PowerShell в Windows 10 по-умолчанию запоминает последние 4096 команд, которые сохраняются в текстовом файле, расположенном в профиле каждого пользователя
%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt.
История ведется отдельно для консоли PowerShell, отдельно для ISE.

Powershell 5 - история команд в консоли

Если команда PowerShell требует длительное время на выполнение, вы увидите ее в истории команд только по ее завершении.

В cmd вы можете вывести историю команд в текущей сессии с помощью:

doskey /history

Для поиска используется клавиша F7.

история команд в cmd - doskey /history

Поиск в истории команд PowerShell

Если вы не хотите пролистывать всю историю команд PowerShell, вы можете выполнить поиск по истории команд с помощью комбинаций клавиш CTRL+R (поиск в обратном направлении) и CTRL+S (поиск вперед). Нажмите сочетание клавиш и начните вводить часть команды, которую вы хотите найти в ранее выполненных командах. Выполняется поиск указанного текста на любой позиции в команде (в отличии от поиска в консоли PowerShell по F8 или Shift+F8, которые ищут совпадения только с начала строки). В консоли PowerShell должна появится предыдущая команда, соответствующая поисковой строке. Совпадения строки подсвечивается в команде.

Если найденная команда вас не устраивает, чтобы продолжить поиск по истории, нажмите сочетание CTRL+R/CTRL+S еще раз. В результате на экране появится следующая команда, соответствующая шаблону поиска.

поиск команды в истории powershell

С помощью клавиши F8 можно найти в истории команду, соответствующую тексту в текущей командной строке. Например, наберите get- и нажмите F8. В истории будет найдена последняя команда, соответствующая строке. Чтобы перейти к следующей команде истории, нажмите F8 еще раз.

powershell поиск в истории по F8

Также можно использовать символ # для поиска в истории команд. Например, чтобы найти последнюю команду, начинающуюся с Get-WMI, наберите #get-wmi и нажмите клавишу Tab. В консоли появится последняя команда, соответствующая шаблону:

как найти ранее выполненную команду в истории powershell

История команда работает одинаково как в классическом Windows PowerShell, так и в новом PowerShell Core (если вы уже обновили свою версию PoSh).

Чтобы получить список команд в окне блокнота, выполните команду:

notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)

открыть историю команд powershell в блокноте

Для вывода списка команд в истории, соответствующих запросу, можно использовать:

Get-History | Select-String -Pattern "Get-"

поиск в комнадах Get-History | Select-String pattern

Настройка истории команд PowerShell с помощью модуля PSReadLine

Функционал истории команд в PowerShell 5.0 и выше встроен не в сам Windows Management Framework, а основан на стороннем модуле PSReadLine, существенно расширяющим функционал консоли PowerShell. В Windows 10 он находится в каталоге C:\Program Files\WindowsPowerShell\Modules\PSReadline и автоматически импортируется при запуске консоли PowerShell. PSReadLine осуществляет подсветку синтаксиса в консоли, отвечает за возможность использования выделения текста мышкой и его копирование/вставку с помощью CTRL+C и CTRL+V. PSReadLine не входит в состав отдельно устанавливаемого PowerShell 5 для предыдущих версий Windows. Чтобы вести историю команд PowerShell в предыдущих версиях Windows (Windows 7/8.1 и Windows Server 2008R2/2012R2), кроме установки Windows Management Framework 5.1, необходимо установить модуль PSReadLine с помощью менеджера пакетов PackageManagement (ранее OneGet) из оналйн репозитория командой:

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-PSReadlineKeyHandler

Для настройки истории команд PowerShell используются командлеты Get-PSReadlineOption и Set-PSReadlineOption. Текущие настройки можно получить так:

Get-PSReadlineOption | select HistoryNoDuplicates, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle

Get-PSReadlineOption

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

  • HistoryNoDuplicates – нужно ли сохранять в истории PowerShell одинаковые команды;
  • MaximumHistoryCount – максимальное число сохраненных команд (по умолчанию сохраняются 4096 команд);
  • HistorySearchCursorMovesToEnd — нужно ли переходить в конец команды при поиске;
  • HistorySearchCaseSensitive – нужно ли учитывать регистр при выполнении поиска (по умолчанию история команд не учитывает регист);
  • HistorySavePath – путь к текстовому файлу, в который сохраняется история команд PowerShell;
  • HistorySaveStyle – особенности сохранения команд:
    • SaveIncrementally — команды сохраняются при выполнении (по-умолчанию)
    • SaveAtExit — сохранение истории при закрытии консоли
    • SaveNothing — отключает ведение истории команд

Изменить настройки модуля PSReadLine можно с помощью команды Set-PSReadlineOption. Например:

Set-PSReadlineOption -HistorySaveStyle SaveAtExit

Set-PSReadlineOption

Чтобы увеличить количество сохраняемых команд PowerShell в логе, выполните команду:

Set-PSReadlineOption -MaximumHistoryCount 10000

Таким образом, возможность сохранения истории выполненных команд в PowerShell 5.0 — это еще один аргумента отказа от cmd в пользу консоли PoSh.

Очистка истории предыдущих команд в PowerShell

Как мы рассказали выше, модуль PSReadline сохраняет все консольные команды PowerShell в текстовый файл. Однако в некоторых случаях администратору приходится вводить в консоли PowerShell различную конфиденциальную информацию (имена и пароли учетных записей, адреса, персональные данные и т.д.). Другой администратор сервера или атакующий может получить доступ к этим чувствительным данным в текстовом файле. В целях безопасности вы можете очистить журнал выполненных команд PowerShell или совсем отключить историю команд.

Командлет Clear-History можно использовать только для очистки истории команд в оперативной памяти текущего сеанса PowerShell (очищается список предыдущих команд, которые выводит командлет Get-History).

Можно удалить из истории только одну предыдущую команду:

Clear-History -count 1 -newest

Или все команды по определенной маске:
Clear-History -CommandLine *set-ad*

Чтобы полностью удалить историю предыдущих команд PowerShell, нужно удалить файл, в который они сохраняются модулем PSReadline. Проще всего это сделать командой:

Remove-Item (Get-PSReadlineOption).HistorySavePath

После этого закройте сессию PoSh.

Если нужно полностью отключить ведение истории команд PowerShell, выполните команду:

Set-PSReadlineOption -HistorySaveStyle SaveNothing

очистить и отключить историю команд powershell

Импорт истории команд 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)

Add-History - импорт истории комманд powershell

Для автоматического импорта команд в файл при завершении сессии 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 }


Предыдущая статья Следующая статья


Комментариев: 4 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)