История команд в сеансе PowerShell

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

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

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

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

Можно вывести более подробную информацию о ранее выполненных командах, в том числе статуса и времени запуска/окончания выполнения команды:
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 попадает в историю только после окончания ее выполнения. Если команда PoSh требует длительного времени на выполнение, вы увидите ее в истории команд только по ее завершении.

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

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

Примечание. Функционал ведения истории команд в PowerShell 5 встроен не в сам 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 7 / 8.1 / Windows Server 2008/R2 / 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Настройка истории команд выполняется при помощи командлетов 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 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 в другую сессию

В некоторых случаях бывает удобно иметь под рукой один и то те список часто-используемых команд 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 }


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


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

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

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

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