Изначально Windows PowerShell (как и командная строка cmd) сохраняет историю выполненных команд только в текущей сессии PowerShell. При закрытии окошка консоли PowerShell или перезагрузке компьютера, история команд PowerShell, которые вы набирали, нигде не сохраняется. По сравнению с той же bash это является существенным недостатком. Начиная с версии PowerShell 5.0, представленной в Windows 10, по-умолчанию все введенные команды в PS консоли теперь сохраняются в текстовый файл журнала.
История команд в PowerShell, модуль PSReadLine
Допустим, вы набрали и выполнили какую-то сложную команду PowerShell. В Windows 10 и Windows Server 2016 даже после перезагрузки компьютера вы можете открыть новую сессию PowerShell и нажать клавишу со стрелкой вверх. На экране должна отобразить последняя введенная вами команда. Если продолжить нажать клавишу «вверх» — вы увидите все команды, выполненные ранее. Таким образом с помощью клавиш «вверх» и «вниз» вы можете прокручивать историю команд и повторно выполнять ранее набранные команды.
Get-History
).Чтобы вывести подробную информацию о ранее выполненных командах в текущей сессии PowerShell, в том числе реи время запуска/окончания выполнения команды:
Get-History | Format-List -Property *
Оболочка PowerShell в Windows 10 по-умолчанию запоминает последние 4096 команд, которые сохраняются в текстовом файле, расположенном в профиле каждого пользователя
%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
.
История ведется отдельно для консоли 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
. В консоли появится последняя команда, соответствующая шаблону:
Чтобы получить список команд в окне блокнота, выполните команду:
notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)
Для вывода списка команд в истории, соответствующих запросу, можно использовать:
Get-History | Select-String -Pattern "Get-"
Настройка истории команд 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 Перейти к последнему элементу (текущий ввод) в журнале
Для настройки истории команд PowerShell используются командлеты 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 в логе, выполните команду:
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 на различных компьютерах. Вы можете экспортировать текущую историю команд в 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.
Можно вести и свою расширенную историю с запоминанием вывода команд, пример который надо вставить в профиль пользователя (ввести в консоли powershell notepad $profile, и добавить вначале):
Function StartTranscript {
Trap {
# Log error to a file
#Write-Host $Transcript
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
Спасибо, и правда интересная фича 🙂
Это штатное транскрибирование. К тому же как вы из него прочитаете историю на лету?
Интересно, с консоли история сохранется, а вот от ISE пусто.
PowerShell Version 5.1.18362.1171