If you use PowerShell for long enough, sooner or later you are bound to run into a situation where things aren’t working quite the way that they should.
Last night, for instance, I was trying something new in PowerShell and spent about an hour trying various command combinations before I finally got the results that I wanted.
When you encounter these types of situations in PowerShell, it is relatively easy to export the commands that worked and turn them into a script. All you do is enter the Get-History cmdlet and then use the Out-File cmdlet to write the PowerShell command history to a text file.
For example, if you wanted to write the current command history to a file named history.txt, you could type:
Get-History | Out-File C:\History.txt
While this command works, it does not produce a ready-to-use script. Instead, your text file will contain many items you will need to edit out. These items include column headers, command ID numbers, and unwanted commands. You can see an example of this in Figure 1.
Figure 1. The full PowerShell command history has been dumped into a text file.
Decluttering the Text File
With that in mind, recall the situation that I described earlier. I had spent an hour trying to get a set of PowerShell commands to work properly. After getting the commands to work, I wanted to export the command history to create a script. However, my history also contained the commands that hadn’t worked, which would be exported, as well.
There are a couple of ways to deal with this. One option is to dump the entire command history into a file and then use Notepad or other text editors to remove what doesn’t belong. That’s a perfectly valid option.
Another option is to get PowerShell to remove most of the clutter for you. In this case, you might still have to do some minor editing, but you can get PowerShell to remove most of the clutter upfront.
As previously mentioned, three elements will typically end up in the exported command history that you will need to remove: column headers, command ID numbers, and unwanted commands. I will show you how to get rid of all three of these elements.
Remove Column Headers
Removing column headers is relatively simple. All you do is use the Format-Table command and append the -Hide parameter. If your goal is to strip the headers from the command history, write that history to a file and use this command:
Get-History | Format-Table -Hide | Out-File C:\Scripts\History.txt
Figure 2. You can use the Format-Table cmdlet to strip the column headers.
Remove the Command ID Numbers
Now let’s look at how to remove the command ID numbers. The ID numbers are the sequential numbers that appear before each command in the history output.
Removing the command IDs is just a matter of using the Select-Object command and specifying that you only want to select the commandline. When combined with the techniques discussed above, the command becomes the following:
Get-History | Select-Object CommandLine | Format-Table -Hide | Out-File C:\Scripts\History.txt
As you can see in Figure 3, this command’s output looks much more like a script than the previous output did.
Figure 3. The column headers and command IDs have been removed, leaving only the command history.
Remove Unwanted Commands
Removing unwanted commands tends to be a bit trickier than the other techniques that I have discussed. In all honesty, there may be real-world situations in which it is easier to manually remove unwanted commands from the output file after the file has been created. Nonetheless, I wanted to show you some tricks for removing unwanted commands.
Exporting commands that are sequential
Here, the thing to remember is that PowerShell treats the command history as an array. As such, you simply need to specify which items from the array you want to include in the final output. This is where the command ID comes into play.
Suppose that you only wanted to include commands 3 through 6 in the output. To do so, you would set up a loop by typing 3..6.
The command would look like this:
3..6 | Get-History | Select-Object CommandLine | Format-Table -Hide | Out-File C:\Scripts\History.txt
You can see this command and its output in Figure 4.
Figure 4. I have created a text file containing only items 3, 4, 5, and 6 from the command history.
Exporting commands that are not sequential
But what if the commands that you wanted to export from the command history were not sequential? For instance, suppose that you wanted to export command numbers 3, 4, 5, 6, 8, 11, and 12. There are two tricks you will need to accomplish this.
The first trick is to create multiple ranges, separated by a plus sign. For example, 3..6 + 11..12 would give you items 3, 4, 5, 6, 11, and 12.
The second trick is that you may occasionally need to create a single value range. As you will recall, the original list of commands to export was 3, 4, 5, 6, 8, 11, and 12. The problem with this is that 3-6 is a range and 11-12 is a range, but 8 is a single number. The way that you would handle this is by treating 8 as a single value range. Hence, you would enter 8..8. As such, the full command would be:
3..6 + 8..8 + 11..12 | Get-History | Select-Object CommandLine | Format-Table -Hide | Out-File C:\Scripts\History.txt
Figure 5. You can choose which commands to export.