Pipe output to the clipboard using PowerShell

clipboard, powershell

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
#>

Problem

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 ```

Original source

Related problems