Copiar comando del historial de PowerShell
Pensé en compartir una utilidad PowerShell breve pero útil. Esto es algo que resulta muy útil cuando escribo. Como sabe, PowerShell mantiene un historial de comandos en su sesión de PowerShell. Puede ver el historial con el cmdlet Get-History o su alias h. Para volver a ejecutar un comando, utilice Invoke-History o su alias r, especificando el ID del historial. También puedes usar PSReadline y Ctrl+R para buscar en el historial. Una ventaja de este enfoque es que técnicamente está buscando en su historial guardado, que puede incluir comandos de sesiones anteriores. Lo uso todo el tiempo, pero a veces tengo necesidades ligeramente diferentes. Ahí es donde entra en juego la función de hoy.
Hay muchas ocasiones en las que quiero la línea de comando de un elemento del historial. Ejecute esto para ver de qué estoy hablando.
Get-History | Select ID,CommandlineNecesito copiar la línea de comando para poder pegarla en un documento o quiero devolverla a mi mensaje para volver a ejecutarla o editarla y luego ejecutarla. Ejecutar Invoke-History es lo suficientemente simple como para volver a ejecutar el comando, pero no puedo modificarlo. O puedo usar PSReadline y buscar el comando. Una vez que lo encuentro, puedo ajustarlo y luego ejecutarlo. Pero necesito algo intermedio. La respuesta es una utilidad para copiar la línea de comando del elemento del historial especificado al portapapeles. Lee Holmes tiene una utilidad similar descrita en el libro de recetas de PowerShell. Esta es mi versión.
Function Copy-HistoryCommand {
[CmdletBinding(SupportsShouldProcess)]
[alias("ch")]
[outputtype("None", "System.String")]
Param(
[Parameter(Position = 0)]
[ValidateNotNullOrEmpty()]
[int]$ID = $(Get-History).Count,
[switch]$Passthru)
Begin {
Write-Verbose "[BEGIN ] Starting: $($MyInvocation.Mycommand)"
} #begin
Process {
Write-Verbose "[PROCESS] Getting commandline from history item: $id"
$cmdstring = (Get-History -Id $id).CommandLine
If ($PSCmdlet.ShouldProcess("ID #$id [$cmdstring]")) {
$cmdstring | Microsoft.PowerShell.Management\Set-Clipboard
If ($Passthru) {
#write the command to the pipeline
$cmdstring
} #If passthru
}
} #process
End {
Write-Verbose "[END ] Ending: $($MyInvocation.Mycommand)"
} #end
} #close functionEl comando es bastante simple. Toma la propiedad de la línea de comando y la copia en el portapapeles usando Set-Clipboard. La función simplemente hace esto más fácil al definir un alias y agregar algunas características como -Passthru y -WhatIf.
En este ejemplo, estoy copiando el comando del elemento 3 del historial al portapapeles. Utilicé -Passthru para que puedas verlo por ti mismo. En mi sesión de Terminal de Windows, puedo usar Ctrl+V o el botón derecho del mouse para pegar el comando cuando se me indique. Eso es lo que me encanta de esto. Solo se necesitan unas pocas teclas para recuperar un comando que quiero editar y volver a ejecutar. No encontré una manera de copiar el comando y pegarlo automáticamente en el siguiente mensaje. Pero el proceso actual es bastante simple y rápido.
Este comando eventualmente será parte del módulo PSScriptTools. Pero por ahora, siéntete libre de usar este código si es algo que te resulte útil.
