When writing code in PowerShell the last thing you might think about is
the Windows clipboard. We all probably know the infamous Ctrl-C and Ctrl-V keyboard shortcuts to copy and paste from the clipboard but this is typically done via the GUI. In our PowerShell scripts, it's not too useful. However, did you know that you can use PowerShell to copy to the clipboard and retrieve it's contents?

In this article, I'm going to go over how we used to get copy and paste functionality in PowerShell and then introduce you to the cmdlets that PowerShell provides starting in version 5.

Prior to PowerShell v5, the only way to copy to the clipboard was by using the clip.exe application.

Old School clip.exe

This application had been around a long time and just worked. By piping text to clip.exe, you could get text copied onto the clipboard. This worked but it was always annoying when it added a carriage return after each entry.

PS51> Write-Output 'Hello' | clip

Not only that but we had no easy way to pull information from the clipboard. We were forced to manually paste the contents once they were in the clipboard. With the native clipboard commands, this is no more!

We now have two cmdlets that solve this problem much better; Get-Clipboard and Set-Clipboard.

Set-Clipboard

Set-Clipboard replaces clip.exe but behaves exactly the same. Now, instead of piping output to clip, you can use Set-Clipboard. If you do this, you'll notice that the trailing carriage return is gone when you paste the contents somewhere.

The clipboard now only contains the string Hello.

PS> Write-Output 'Hello' | Set-Clipboard

Another useful feature with Set-Clipboard is the Append parameter. Traditionally, the clipboard has only been able to store one item. Now, by using the Append parameter with Set-Clipboard, you can add an unlimited number of items without removing the previous.

PS> Write-Output 'Hello' | Set-Clipboard -Append

Get-Clipboard Parameters

Even if you don't use Set-Clipboard to copy contents to the clipboard, you can still use Get-Clipboard to understand a few different types other than simple strings. For example, if you've copied and a list of files from File Explorer and you'd like to get this list into your PowerShell console, simply use the Format parameter and the �FileDropList value on Get-Clipboard.

PS51> Get-Clipboard -Format FileDropList

Directory: \\Mac\Home\Downloads


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------         8/1/2019  10:42 AM       17919094 00_03_xr30_whatyoushouldhave.mov


    Directory: \\Mac\Home\Documents\Snagit\Autosaved Captures.localized


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------         8/1/2019   1:58 PM      169144472 2019-08-01_13-47-55.mp4

You can see that it understands the type of data in the clipboard is a list of files. Also, you can do the same with images and other entities.

Copy an image from another application and use provide -Format Image to Get-Clipboard to retrieve various properties about the image.

PS51> Get-Clipboard -Format Image


Tag                  :
PhysicalDimension    : {Width=813, Height=113}
Size                 : {Width=813, Height=113}
Width                : 813
Height               : 113
HorizontalResolution : 96
VerticalResolution   : 96
Flags                : 335888
RawFormat            : [ImageFormat: b96b3caa-0728-11d3-9d7b-0000f81ef32e]
PixelFormat          : Format32bppRgb
Palette              : System.Drawing.Imaging.ColorPalette
FrameDimensionsList  : {7462dc86-6180-4c7e-8e3f-ee7333a7a483}
PropertyIdList       : {}
PropertyItems        : {}

Clipboard Manipulation in PowerShell Core

Unfortunately, the Get-Clipboard and Set-Clipboard commands are not available in PowerShell Core (v6+) but you can still use them using the WindowsCompatibility module. The WindowsCompatibility module allows you to use Windows PowerShell cmdlets within PowerShell Core.

Once you have the WindowsCompatibility module installed, run Invoke-WinCommand and wrap your Get-Clipboard and Set-Clipboard references inside.

PS622> Invoke-WinCommand -ScriptBlock {'This is on the clipboard' | Set-ClipBoard}
PS622> Invoke-WinCommand -ScriptBlock {Get-ClipBoard}
This is on the clipboard

You'll find that you can read and write to the clipboard just as you would with Windows PowerShell.

Summary

You can do so much more with the clipboard in PowerShell nowadays. Using the Get-Clipboard and Set-Clipboard cmdlets allows you to use PowerShell to copy to the clipboard and to intelligently paste from the clipboard too.

For a full breakdown of the cmdlets, check out the detailed help:

PS51> Get-Help Set-Clipboard -Detailed
PS51> Get-Help Get-Clipboard -Detailed

This will give you all of the various parameters that you can try out.

Join the Jar Tippers on Patreon

It takes a lot of time to write detailed blog posts like this one. In a single-income family, this blog is one way I depend on to keep the lights on. I'd be eternally grateful if you could become a Patreon patron today!

Become a Patron!