Search code examples
powershellclipboard

Pipe output to the clipboard using PowerShell


EDIT: 23 Oct 2020

See postanote's answer.

EDIT: 14 May 2015

After 3 years, I thought I would share my ClipboardModule (I hope I am allowed to):

Add-Type -AssemblyName System.Windows.Forms

Function Get-Clipboard {
    param([switch]$SplitLines)

    $text = [Windows.Forms.Clipboard]::GetText();
    
    if ($SplitLines) {
        $xs = $text -split [Environment]::NewLine
        if ($xs.Length -gt 1 -and -not($xs[-1])) {
            $xs[0..($xs.Length - 2)]
        } else {
            $xs
        }
    } else {
        $text
    }
}

function Set-Clipboard {
    $in = @($input)

    $out = 
        if ($in.Length -eq 1 -and $in[0] -is [string]) { $in[0] }
        else { $in | Out-String }
    
    if ($out) {
        [Windows.Forms.Clipboard]::SetText($out);
    } else {
        # input is nothing, therefore clear the clipboard
        [Windows.Forms.Clipboard]::Clear();
    }
}


function GetSet-Clipboard {
    param([switch]$SplitLines, [Parameter(ValueFromPipeLine=$true)]$ObjectSet)

    if ($input) {
        $ObjectSet = $input;
    }

    if ($ObjectSet) {
        $ObjectSet | Set-Clipboard
    } else {
        Get-Clipboard -SplitLines:$SplitLines
    }
}

Set-Alias cb GetSet-Clipboard

Export-ModuleMember -Function *-* -Alias *

I usually use the cb alias (for GetSet-Clipboard) because it is two way i.e can get or set the clipboard:

cb                # gets the contents of the clipboard
"john" | cb       # sets the clipboard to "john"
cb -s             # gets the clipboard and splits it into lines

Solution

  • Native clip cmdlets in PSv7

    $Host
    # Results
    <#
    Name             : ConsoleHost
    Version          : 7.0.3
    InstanceId       : 54be9bfd-799d-4213-a13a-22403c1d9ed8
    UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
    CurrentCulture   : en-US
    CurrentUICulture : en-US
    PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
    DebuggerEnabled  : True
    IsRunspacePushed : False
    Runspace         : System.Management.Automation.Runspaces.LocalRunspace
    #>
    
    Get-Command -Name '*clip*'|Format-Table -a
    # Results
    <#
    CommandType Name                         Version        Source
    ----------- ----                         -------        ------
    Function    Get-Clipboard                1.3.6          PowerShellCookbook
    Function    Set-Clipboard                1.3.6          PowerShellCookbook
    Function    Start-ClipboardHistoryViewer 0.0            ModuleLibrary
    Cmdlet      Get-Clipboard                7.0.0.0        Microsoft.PowerShell.Management
    Cmdlet      Set-Clipboard                7.0.0.0        Microsoft.PowerShell.Management
    Cmdlet      Set-UDClipboard              2.9.0          UniversalDashboard
    Application clip.exe                     10.0.19041.1   C:\WINDOWS\system32\clip.exe
    Application ClipRenew.exe                10.0.19041.1   C:\WINDOWS\system32\ClipRenew.exe
    Application ClipUp.exe                   10.0.19041.488 C:\WINDOWS\system32\ClipUp.exe
    Application rdpclip.exe                  10.0.19041.423 C:\WINDOWS\system32\rdpclip.exe
    #>