Sometimes you line up the right cmdlets, appreciate what you’ve done for a moment, only to become mildly irritated that you never thought of that before. I just did that.
We all know, or should rather, that the Get-History cmdlet returns a list of commands that have been entered during the current Windows PowerShell session. If you open up a new console, enter a couple commands, and then run Get-History, or one of its aliases (ghy, h, history), it’ll show you what commands you’ve entered up until that point. Take this example, for instance:
PS> Get-Process | Select-Object -Last 2 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 263 11 1680 5132 46 0.02 3356 WUDFHost 227 12 1824 6804 47 0.22 3840 WUDFHost PS> Get-Service | Select-Object -First 2 Status Name DisplayName ------ ---- ----------- Running AdobeARMservice Adobe Acrobat Update Service Stopped AdobeFlashPlaye... Adobe Flash Player Update Service PS> Get-History Id CommandLine -- ----------- 1 Get-Process | Select-Object -Last 2 2 Get-Service | Select-Object -First 2 PS> Get-History Id CommandLine -- ----------- 1 Get-Process | Select-Object -Last 2 2 Get-Service | Select-Object -First 2 3 Get-History
I use the up arrow quite often to cycle through my previous commands, and press Enter when I’ve found the one I want to run again. That’s one way to rerun a previously run command. Another, is to use the Get-History cmdlet. First, you use it to determine the ID of the command you want to rerun, such as we’ve done above. Then, you can run Get-History again with the -Id parameter and pipe that result to Invoke-History (aliases: ihy, r), such as we’ve done below. You can also just use Invoke-History -Id 1 without the use of Get-History.
PS> Get-History -Id 1 | Invoke-History Get-Process | Select-Object -Last 2 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 263 11 1680 5132 46 0.02 3356 WUDFHost 227 12 1824 6804 47 0.22 3840 WUDFHost
What about making a “menu,” where we can select the command we want to run and press OK to run it? Easy. If you’ve been paying attention to PowerShell, then you’ve probably seen the Out-GridView cmdlet before. Let’s put it to good use, and I’ll show you the cmdlets I lined up.
PS> Get-History | Out-GridView -PassThru | Invoke-History
When I enter the command above, it will show the dialog box below; however, your dialog box will be the default size. I’ve resized mine so that the image better fits on this page. If it’s important to you, you can change what the title says by including Out-GridView’s -Title parameter: Get-History | Out-GridView -PassThru -Title ‘History Menu’ | Invoke-History.
After I select an option from the list, and press OK, the history item will be rerun.
PS> Get-History | Out-GridView -PassThru | Invoke-History Get-Process | Select-Object -Last 2 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 263 11 1680 5132 46 0.02 3356 WUDFHost 227 12 1824 6804 47 0.22 3840 WUDFHost PS>
Well, there it is. Something so simple and so obvious that I can’t believe I never thought of it before.