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

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

По-умолчанию в Windows, все команды, введенные в консоли PowerShell, сохраняются в текстовый лог-файл. Благодаря этому вы можете в любой момент повторно выполнить любую команду и просмотреть историю выполненных команд PowerShell даже после закрытия консоли или перезагрузки компьютера. В PowerShell сейчас используются два провайдера истории команда: история команд в текущей сессии (выводит командлет Get-History) и текстовый лог с предыдущими командами, которые сохраняет модуль PSReadLine.

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

Если нажать клавишу “вверх” в консоли PowerShell, перед вами появится последняя введенная вами команда. Если продолжить нажать клавишу «вверх» — вы увидите все команды, выполненные вами ранее. Таким образом с помощью клавиш «вверх» и «вниз» вы можете прокручивать историю команд PowerShell и повторно выполнять ранее набранные команды. Это удобно, если вам нужно быстро выполнить одну из предыдущих команд, не набирая ее заново.

Консоль PowerShell сохраняет полную историю команд, начиная с версии Windows PowerShell 5.1 (устанавливается по умолчанию начиная с Windows 10). В более ранних версиях Windows PowerShell (как и командная строка cmd) сохраняет историю выполненных команд только в текущей сессии PowerShell. Для просмотра истории предыдущих команд в текущей сессии используется командлет
Get-History
.

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

Get-History | Format-List -Property *

get-history в powershell

Вы можете выполнить команду по ее ID:

Invoke-History 4

Если вы закрыли консоль PowerShell, то история команд сбрасывается и список в Get-History очищается.

Однако PowerShell 5.1 и PowerShell Core также сохраняют последние 4096 команд в тестовом файле в профиле каждого пользователя
%userprofile%AppDataRoamingMicrosoftWindowsPowerShellPSReadlineConsoleHost_history.txt
.
Вы можете открыть этот файл и просмотреть историю команд в любом текстовом редакторе. Например, чтобы открыть файл с журналом команд с помощью блокнота:

notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)

файл ConsoleHost_history.txt с историей ранее выполненных команд powershell

История ведется отдельно для консоли PowerShell, отдельно для ISE.

Если команда 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

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

 

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

и

Get-Content (Get-PSReadlineOption).HistorySavePath| Select-String -Pattern "Get-"

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

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

Функционал хранения истории команд в PowerShell встроен не в сам Windows Management Framework, а основан на дополнительном модуле PSReadLine, который существенно расширяет функционал консоли PowerShell. Модуль PSReadLine в Windows находится в каталоге C:Program FilesWindowsPowerShellModulesPSReadline и автоматически импортируется при запуске консоли PowerShell.

PSReadLine осуществляет подсветку синтаксиса в консоли, отвечает за возможность использования выделения текста мышкой и его копирование/вставку с помощью CTRL+C и CTRL+V.

Проверьте, что модуль загружен в вашу сессию PowerShell:

Get-Module

проверить что модуль psreadline установлен

Если модуль PSReadline не загружен, проверьте что он установлен и если нужно, установите его из онлайн репозитория PowerShell Gallery:

Get-Module -ListAvailable | where {$_.name -like "*PSReadline*"}

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 модуля PSReadLine:

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. Например, чтобы увеличить количество сохраняемых команд PowerShell в логе:

Set-PSReadlineOption -MaximumHistoryCount 10000

Если вам нужно, чтобы в историю команд PowerShell сохранялись не только выполненные команды, но и их вывод, вы можете настроить транскрибирование с помощью следующей функции. Просто добавьте ее в PowerShell профиль пользователя (notepad $profile.CurrentUserAllHosts):

Function StartTranscript {
Trap {
Continue
}
$TranScriptFolder = $($(Split-Path $profile) + 'TranscriptLog')
if (!(Test-Path -Path $TranScriptFolder )) { New-Item -ItemType directory -Path $TranScriptFolder }
Start-Transcript -Append ($($TranScriptFolder + $(get-date -format 'yyyyMMdd-HHmmss') + '.txt')) -ErrorVariable Transcript -ErrorAction stop
}
StartTranscript

расширенный лого команда в консоли powershell

Теперь в профиле пользователя в каталоге
%USERPROFILE%DocumentsWindowsPowerShellTranscriptLog
для каждого сенаса PowerShell будет содержаться подробный лог-файл.

Как не сохранять определенные команды в историю PoweShell?

В командной оболочке bash в Linux вы можете запретить сохранять в истории команды, которые начинаются с пробела (используется параметр HISTCONTROL= ignorespace). Вы можете настроить такое же поведение и для PowerShell.

Для этого, добавьте в PowerShell профиль текущего пользователя (
$profile.CurrentUserAllHosts
) следующий код:

Set-PSReadLineOption -AddToHistoryHandler {
    param($command)
    if ($command -like ' *') {
        return $false
    }
    return $true
} 

не сохранять определенные команды в историю powershellistoriyu

Теперь, если вы не хотите, чтобы ваша команда была сохранена в историю команд PowerShell, просто начните ее с пробела.

Также, начиная с версии модуля PSReadline v2.0.4, автоматически игнорируются и не сохраняются в историю команды, содержащие следующие ключевые слова: Password, Asplaintext, Token, Apikey, Secret. При этом вы можете командлеты из модуля управления паролями SecretManagement считаются безопасными и разрешены для сохранения.

Использование Predictive IntelliSense для набора команд по истории

В версии PSReadLine 2.2.2+ доступна новая функция PowerShell Predictive IntelliSense. Данная функция при наборе команды в консоли выводит наиболее подходящие команды из локальной истории команд.

В этом примере я набрал в консоли get-wm и функция Predictive IntelliSense предложила мне одну из команд, введенных ранее, которая соответствует моему вводу. Если эта команда мне подходит. Если меня устраивает эта команда, нужно нажать клавишу вправо чтобы принять эту команду и не набирать оставшиеся символы вручную.

Как использовать Predictive Intellisense в PowerShell

По умолчанию подсказки Predictive IntelliSense выводятся серым текстом и не очень хорошо читаются на черном фоне консоли PowerShell. Вы можете сделать текст подсказок более контрастным с помощью команды:

Set-PSReadLineOption -Colors @{ InlinePrediction = '#7A957A'}

Predictive IntelliSense по умолчанию включена начиная с PSReadLine 2.2.6. Чтобы включить ее вручную, выполните:

Set-PSReadLineOption -PredictionSource History

Чтобы сбросить предложение Predictive IntelliSense, нажмите Esc.

С помощью клавиши F2 можно переключиться в другое представление. Теперь вместо вывода одной наиболее подходящей команды (
InlineView
) будет выводится выпадающий список со всеми похожими командами (
ListView
).

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

С помощью клавиш вверх/вниз вы можете быстро выбрать нужную команду из истории команд.

Predictive IntelliSense буте работать как в обычной командной строке pwsh.exe/powershell.exe, так и в Windows Terminal и Visual Studio Code.

Очистка истории предыдущих команд в 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:pscommands_hist.xml

Для импорта команд из файла в другую сессию PoSh (на локальном или другом компьютере), выполните:

Add-History -InputObject (Import-Clixml -Path c:pscommands_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 }

Windows 10
Истории предыдущих команд в консоли PowerShell