По-умолчанию в Windows, все команды, введенные в консоли PowerShell, сохраняются в текстовый лог-файл. Благодаря этому вы можете в любой момент повторно выполнить любую команду и просмотреть историю выполненных команд PowerShell даже после закрытия консоли или перезагрузки компьютера. В PowerShell сейчас используются два провайдера истории команда: история команд в текущей сессии (выводит командлет Get-History) и текстовый лог с предыдущими командами, которые сохраняет модуль PSReadLine.
- Просмотр история команд в PowerShell
- Поиск в истории команд PowerShell
- Настройка истории команд PowerShell с помощью модуля PSReadLine
- Как не сохранять определенные команды в историю PoweShell?
- Использование Predictive IntelliSense для набора команд по истории
- Очистка истории предыдущих команд в PowerShell
- Импорт истории команд PowerShell в другую сессию
Просмотр история команд в PowerShell
Если нажать клавишу “вверх” в консоли PowerShell, перед вами появится последняя введенная вами команда. Если продолжить нажать клавишу «вверх» — вы увидите все команды, выполненные вами ранее. Таким образом с помощью клавиш «вверх» и «вниз» вы можете прокручивать историю команд PowerShell и повторно выполнять ранее набранные команды. Это удобно, если вам нужно быстро выполнить одну из предыдущих команд, не набирая ее заново.
Консоль PowerShell сохраняет полную историю команд, начиная с версии Windows PowerShell 5.1 (устанавливается по умолчанию начиная с Windows 10). В более ранних версиях Windows PowerShell (как и командная строка cmd) сохраняет историю выполненных команд только в текущей сессии PowerShell. Для просмотра истории предыдущих команд в текущей сессии используется командлет
Get-History
.
Чтобы вывести подробную информацию о ранее выполненных командах в текущей сессии PowerShell, в том числе время запуска/окончания команды:
Get-History | Format-List -Property *
Вы можете выполнить команду по ее ID:
Invoke-History 4
Если вы закрыли консоль PowerShell, то история команд сбрасывается и список в Get-History очищается.
Однако PowerShell 5.1 и PowerShell Core также сохраняют последние 4096 команд в тестовом файле в профиле каждого пользователя
%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
.
Вы можете открыть этот файл и просмотреть историю команд в любом текстовом редакторе. Например, чтобы открыть файл с журналом команд с помощью блокнота:
notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)
История ведется отдельно для консоли PowerShell, отдельно для ISE.
Если команда PowerShell требует длительное время на выполнение, вы увидите ее в истории команд только по ее завершении.
doskey /history
Для поиска используется клавиша
F7
.
Поиск в истории команд PowerShell
Если вы не хотите пролистывать всю историю команд PowerShell, вы можете выполнить поиск по истории команд с помощью комбинаций клавиш CTRL+R (поиск в обратном направлении) и CTRL+S (поиск вперед). Нажмите сочетание клавиш и начните вводить часть команды, которую вы хотите найти в ранее выполненных командах. Выполняется поиск указанного текста на любой позиции в команде (в отличии от поиска в консоли PowerShell по F8 или Shift+F8, которые ищут совпадения только с начала строки). В консоли PowerShell должна появится предыдущая команда, соответствующая поисковой строке. Совпадения строки подсвечивается в команде.
Если найденная команда вас не устраивает, чтобы продолжить поиск по истории, нажмите сочетание
CTRL+R
/
CTRL+S
еще раз. В результате на экране появится следующая команда, соответствующая шаблону поиска.
С помощью клавиши
F8
можно найти в истории команду, соответствующую тексту в текущей командной строке. Например, наберите
get-
и нажмите
F8
. В истории будет найдена последняя команда, соответствующая строке. Чтобы перейти к следующей команде истории, нажмите F8 еще раз.
Также можно использовать символ
#
для поиска в истории команд. Например, чтобы найти последнюю команду, начинающуюся с
Get-WMI
, наберите
#get-wmi
и нажмите клавишу
Tab
. В консоли появится последняя команда, соответствующая шаблону:
winget install --id=Microsoft.PowerShell -e
Для вывода списка команд в истории, соответствующих запросу, можно использовать:
Get-History | Select-String -Pattern "Get-"
и
Get-Content (Get-PSReadlineOption).HistorySavePath| Select-String -Pattern "Get-"
Настройка истории команд PowerShell с помощью модуля PSReadLine
Функционал хранения истории команд в PowerShell встроен не в сам Windows Management Framework, а основан на дополнительном модуле PSReadLine, который существенно расширяет функционал консоли PowerShell. Модуль PSReadLine в Windows находится в каталоге C:\Program Files\WindowsPowerShell\Modules\PSReadline и автоматически импортируется при запуске консоли PowerShell.
Проверьте, что модуль загружен в вашу сессию PowerShell:
Get-Module
Если модуль 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 Перейти к последнему элементу (текущий ввод) в журнале
Выведите текущие настройки истории команд PowerShell модуля PSReadLine:
Get-PSReadlineOption | select HistoryNoDuplicates, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle
Здесь могут быть интересны настройки следующих параметров:
- 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
Теперь в профиле пользователя в каталоге
%USERPROFILE%\Documents\WindowsPowerShell\TranscriptLog
для каждого сенаса PowerShell будет содержаться подробный лог-файл.
Как не сохранять определенные команды в историю PoweShell?
В командной оболочке bash в Linux вы можете запретить сохранять в истории команды, которые начинаются с пробела (используется параметр HISTCONTROL= ignorespace). Вы можете настроить такое же поведение и для PowerShell.
Для этого, добавьте в PowerShell профиль текущего пользователя (
$profile.CurrentUserAllHosts
) следующий код:
Set-PSReadLineOption -AddToHistoryHandler { param($command) if ($command -like ' *') { return $false } return $true }
Set-ExecutionPolicy Remotesigned
Теперь, если вы не хотите, чтобы ваша команда была сохранена в историю команд 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. Вы можете сделать текст подсказок более контрастным с помощью команды:
Set-PSReadLineOption -Colors @{ InlinePrediction = '#7A957A'}
Set-PSReadLineOption -PredictionSource History
Чтобы сбросить предложение Predictive IntelliSense, нажмите Esc.
С помощью клавиши F2 можно переключиться в другое представление. Теперь вместо вывода одной наиболее подходящей команды (
InlineView
) будет выводится выпадающий список со всеми похожими командами (
ListView
).
С помощью клавиш вверх/вниз вы можете быстро выбрать нужную команду из истории команд.
Очистка истории предыдущих команд в 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 на различных компьютерах. Вы можете экспортировать текущую историю команд в 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 }