繁体   English   中英

使用 PowerShell 将输出通过管道传输到剪贴板

[英]Pipe output to the clipboard using PowerShell

编辑:2020 年 10 月 23 日

请参阅postanote 的回答

编辑:2015 年 5 月 14 日

3 年后,我想我会分享我的ClipboardModule (我希望我被允许):

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 *

我通常使用cb别名(对于GetSet-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

如果您有 WMF 5.0,PowerShell 包含两个新的 cmdlet:

获取剪贴板和设置剪贴板

编辑:请查看问题而不是解决方案。

这是我的解决方案:

Add-Type -AssemblyName 'System.Windows.Forms'

filter Set-Clipboard {
    begin {
        $cp = @()
    }
    process {
        $_ | Tee-Object -Variable 'cp0'
        $cp = $cp + @($cp0);
    }
    end {
        $str = ($cp | Out-String).ToString();

        [Windows.Forms.Clipboard]::Clear();

        if ( ($str -ne $null) -and ($str -ne '') ) {
            [Windows.Forms.Clipboard]::SetText( $str )
        }

        $cp = @()
    }
}

这将收集数组$cp中的所有对象。 我们使用Tee-Object将当前元素$_重定向到下一个进程并将其存储在数组$cp中。 最后,该过程完成后,我们设置剪贴板的文本。

我以下列方式使用它:

dir -Recurse | Set-Clipboard | Select 'Name'

它似乎有效。

要改用函数:

function Set-Clipboard-Func {
    $str = $input | Out-String

    [Windows.Forms.Clipboard]::Clear();

    if ( ($str -ne $null) -and ($str -ne '') ) {
        [Windows.Forms.Clipboard]::SetText( $str )
    }
}

Powershell 版本 6.1删除了此命令行开关,因此它不再是内置的。

相反,您需要安装ClipboardText 包 在 Powershell 的控制台类型中:

Install-Module -Name ClipboardText

然后你可以使用:

 Set-ClipboardText "hello clipboard"
 Get-ClipboardText

这是 Powershell 维护者的 github 问题,重定向您使用 ClipboardText 包。

PSv7 中的本机剪辑 cmdlet

$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
#>
get-clipboard

按顺序输入文本时跳过换行符。 我用

[System.Windows.Forms.Clipboard]::GetText()

像之前一样。

现在Get-clipboardSet-Clipboard内置于 PSv7 中,您可以在配置文件中使用此功能:“C:\Users<USER_ID>\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1”

function To-Notepad {
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [object]
        $InputObject
    )
  begin   { $objs = @() }
  process { $objs += $InputObject }
  end {
        $old = Get-clipboard # store current value
        $objs | out-string -width 1000 | Set-Clipboard
        & "notepad2" /c
        sleep -mil 500
        $old | Set-Clipboard # restore the original value
  }
}

然后这样使用:

dir -Path C:\Temp | To-Notepad

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM