Historial de comandos anterior en la consola de PowerShell

De forma predeterminada, Windows PowerShell (así como el símbolo del sistema) guarda el historial de comandos ejecutados solo en la sesión actual de PowerShell. Cuando cierra la ventana de la consola de PowerShell o reinicia su computadora, el historial de los comandos de PowerShell que escribió no se guarda en ninguna parte. Comparado con el bash, este es un inconveniente significativo. Empezando con PowerShell 5.0 introducido en Windows 10 (Windows Server 2016), todos los comandos ingresados ​​en la consola PS ahora se guardan en un archivo de registro de texto sin formato de forma predeterminada.

Historial de comandos en PowerShell 5.0 y versiones posteriores

Suponga que escribió y ejecutó algún comando de PowerShell complejo. En Windows 10 y Windows Server 2016, incluso después de reiniciar la computadora, puede abrir una nueva sesión de PowerShell y presionar la tecla de flecha hacia arriba. El último comando que ingresó debería aparecer en la pantalla. Si continúa presionando la tecla «arriba», verá todos los comandos ejecutados anteriormente. Por lo tanto, utilizando las teclas «Up arrow» y «Down arrow”Puede desplazarse por el historial de comandos de PoSh y volver a ejecutar comandos escritos previamente.

En versiones anteriores de PowerShell, el historial de los comandos en la sesión actual no se guarda después de que se cierra. Utilizando el up/down teclas, puede desplazarse por el historial de comandos de la sesión actual de PS solamente o listar el historial de comandos completo usando el Obtener historial cmdlet.

Puede mostrar información más detallada sobre los comandos ejecutados anteriormente en la sesión actual de PowerShell, incluido el estado del comando y el tiempo de inicio / finalización / duración:

Get-History | Format-List -Property *

Powershell obtener-historial

Por defecto, PowerShell en Windows 10 guarda los últimos 4096 comandos que se almacenan en un archivo de texto plano ubicado en el perfil de cada usuario %userprofile%AppDataRoamingMicrosoftWindowsPowerShellPSReadlineConsoleHost_history.txt.

El historial se almacena por separado para PowerShell y PowerShell ISE.

 ConsoleHost_history.txt - historial de comandos de PowerShell

Si un comando de PowerShell tarda mucho en ejecutarse, solo lo verá en el historial de comandos cuando se complete.

En cmd.exe, puede mostrar el historial de comandos en la sesión actual con:

doskey /history

los F7 La tecla se usa para buscar en el historial de cmd.

Comandos de lista de cmd - doskey / history

¿Cómo buscar en el historial de comandos de PowerShell?

Si no desea desplazarse por todo el historial de comandos de PowerShell con las flechas arriba / abajo, puede buscar en el historial de comandos mediante los métodos abreviados de teclado CTRL + R (búsqueda inversa) y CTR + S (búsqueda hacia adelante). Presione la combinación de teclas y comience a escribir parte del comando que desea encontrar en los comandos ejecutados anteriormente. El texto que ingresó se encontrará en el historial de comandos en cualquier posición (a diferencia de la búsqueda en PowerShell usando F8 o Shift+F8, que permite buscar las coincidencias solo desde el principio de la línea). La consola de PowerShell debe mostrar el comando anterior correspondiente a la cadena de búsqueda. Las coincidencias de línea se resaltan en el comando.

Si el comando encontrado no le conviene, para continuar buscando en el historial, presione CTRL+R/CTRL+S de nuevo. Como resultado, el siguiente comando correspondiente al patrón de búsqueda aparecerá en la pantalla.

historial de comandos de powershell bck-i-search

Utilizando el F8 clave, puede encontrar el comando en el historial que coincida con el texto de la línea de comando actual. Por ejemplo, ingrese get- y presione F8. Se encontrará la última entrada en el historial de comandos que coincida con este texto. Para ir al siguiente comando del historial, presione F8 de nuevo.

cómo buscar el historial de comandos de PowerShell

También puede utilizar el # carácter para buscar en el historial de comandos. Por ejemplo, para encontrar el último comando que comienza con Get-WMI, escribe #get-wmi y presione el Tab llave. El último comando que coincida con el patrón aparecerá en la consola:

comandos de búsqueda en el historial de powershell

El historial de comandos funciona de la misma manera tanto en Windows PowerShell clásico como en el nuevo PowerShell Core (si ya ha actualizado su versión de PoSh).

Para obtener una lista del comando PoSh anterior en la ventana Notepad.exe, ejecute el comando:

notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)

abrir archivo de historial de cmdlet de powershell en el bloc de notasPara mostrar una lista de comandos en el historial que coinciden con una consulta, puede usar:

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

PowerShell Get-History Select-String Pattern

Administrar el historial de comandos de PowerShell con el módulo PSReadLine

La funcionalidad del historial de comandos en PowerShell 5.0 no está integrada en el marco de administración de Windows en sí, sino que se basa en el PSReadLine módulo, que amplía significativamente la funcionalidad de la consola PowerShell. PSReadLine resalta la sintaxis en la consola, es responsable de seleccionar el texto con su mouse y copiarlo / pegarlo usando CTRL+C y CTRL+V. Este módulo en Windows 10 se encuentra en el C: Archivos de programa WindowsPowerShell Modules PSReadline carpeta y se importa automáticamente cuando se inicia la consola de PowerShell.

PSReadLine no se incluye en el instalador independiente de PowerShell 5.0 (o nunca) para versiones anteriores de Windows. Por lo tanto, si desea utilizar la funcionalidad del historial de comandos de PowerShell en versiones anteriores de Windows (Windows 7 / 8.1 y Windows Server 2008R2 / 2012R2), además de instalar Windows Management Framework 5.1, deberá instalar el módulo PSReadLine a través del módulo PackageManagement (anteriormente OneGet) desde el repositorio en línea usando el comando:

Install-Module PSReadLine

Se puede mostrar una lista completa de funciones del módulo PSReadLine para administrar el historial de comandos en PowerShell y las teclas asignadas a ellos con el comando:

Get-PSReadlineKeyHandler | ? {$_.function -like '*hist*'}

Key       Function                Description
---       --------                -----------
UpArrow   PreviousHistory         Replace the input with the previous item in the history
DownArrow NextHistory             Replace the input with the next item in the history
Ctrl+r    ReverseSearchHistory    Search history backwards interactively
Ctrl+s    ForwardSearchHistory    Search history forward interactively
Alt+F7    ClearHistory            Remove all items from the command line history (not PowerShell history)
F8        HistorySearchBackward   Search for the previous item in the history that starts with the current input - like NextHistory if the input is empty
Shift+F8  HistorySearchForward    Search for the next item in the history that starts with the current input - like NextHistory if the input is empty
Unbound   ViSearchHistoryBackward Starts a new seach backward in the history.
Unbound   BeginningOfHistory      Move to the first item in the history
Unbound   EndOfHistory            Move to the last item (the current input) in the history

Get-PSReadlineKeyHandler

El historial de comandos se puede configurar usando Get-PSReadlineOption y Set-PSReadlineOption cmdlets. La configuración actual de PSReadline se puede ver usando este comando:

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

Get-PSReadlineOption

La configuración de los siguientes parámetros de PSReadline puede ser importante para nosotros:

  • HistoriaNo Duplicados – determina si se deben guardar los mismos comandos;
  • MaximumHistoryCount – el número máximo de comandos almacenados (por defecto se guardan los últimos 4096 comandos);
  • HistorySearchCursorMovesToEnd – determina si debe ir al final del comando al realizar la búsqueda;
  • HistorySearchCaseSensitive – determina si la búsqueda distingue entre mayúsculas y minúsculas (el historial de comandos de PS no distingue entre mayúsculas y minúsculas de forma predeterminada);
  • HistoriaGuardarPath – muestra la ruta al archivo en el que se almacena el comando;
  • HistorySaveStyle – determina las peculiaridades de guardar comandos:
    • Guardar incrementalmente – los comandos se guardan después de que se ejecutan (por defecto);
    • SaveAtSalir el historial se guarda cuando se cierra la consola de PowerShell;
    • No guardar nada – deshabilitar guardar el historial de comandos.

Puede cambiar la configuración del módulo PSReadLine usando el Set-PSReadlineOption. Por ejemplo:

Set-PSReadlineOption -HistorySaveStyle SaveAtExit

Set-PSReadlineOption

Para aumentar la cantidad de comandos de PowerShell guardados en el archivo de registro, ejecute el comando:

Set-PSReadlineOption -MaximumHistoryCount 10000

Entonces, la capacidad de guardar el historial de comandos de PowerShell ejecutados es uno de los argumentos para preferir la consola PoSh a cmd.

¿Cómo borrar los comandos del historial de la consola de PowerShell?

Como explicamos anteriormente, el módulo PSReadline guarda todos los comandos de la consola de PowerShell en un archivo de texto. Sin embargo, en algunos casos, el administrador tiene que ingresar diversa información sensible en la consola de PowerShell (credenciales, contraseñas, direcciones, datos personales, etc.). Por lo tanto, otro administrador de servidor o atacante puede acceder a los datos del historial en un archivo de texto sin formato. Por motivos de seguridad, es posible que deba borrar el historial de los comandos de PowerShell ejecutados o deshabilitar por completo el historial de comandos.

los Borrar historial El cmdlet solo se puede usar para borrar el historial de comandos en memoria de la sesión actual de PowerShell. Solo borra la lista de comandos anteriores que muestra el cmdlet Get-History.

Puede eliminar solo un comando anterior del historial:

Clear-History -count 1 -newest

O borre todos los comandos con un patrón específico:
Clear-History -CommandLine *set-ad*

Para borrar completamente el historial de los comandos de PowerShell anteriores, debe eliminar el archivo ConsoleHost_history.txt en el que están escritos por el módulo PSReadline. Puede obtener la ubicación actual del archivo de historial de PowerShell y eliminarlo con el comando:

Remove-Item (Get-PSReadlineOption).HistorySavePath

Después de eso, cierre la ventana de la consola de PowerShell.

Si desea deshabilitar por completo el almacenamiento del historial de comandos de PowerShell en un archivo de texto, ejecute el comando:

Set-PSReadlineOption -HistorySaveStyle SaveNothing

deshabilitar el historial de comandos de PowerShell

¿Cómo exportar / importar el historial de comandos de PowerShell a otra sesión?

A veces es conveniente tener el mismo conjunto de comandos de PowerShell de uso frecuente en diferentes computadoras. Puede exportar el historial de comandos actual en su computadora a un archivo xml e importarlo a otras computadoras. También esto se puede hacer copiando el archivo ConsoleHost_history.txt a los perfiles de usuario en las computadoras deseadas.

Para exportar comandos de la sesión actual a un archivo, puede usar el Export-Clixml cmdlet:

Get-History | Export-Clixml -Path c:pscommands_hist.xml

Para importar el historial de comandos de un archivo a otra sesión PoSh (en una computadora local o en otra computadora):

Add-History -InputObject (Import-Clixml -Path c:pscommands_hist.xml)

exportar importar historial de powershell

Para exportar automáticamente los comandos anteriores a un archivo al final de una sesión de PowerShell, puede vincular el script al evento de terminación de la sesión de PoSh (!! La sesión debe terminar necesariamente con el exit comando, en lugar de simplemente cerrar la ventana de PowerShell):

$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 }

Artículos Interesantes