管道输出到剪贴板使用PowerShell(Pipe output to the clipboard

2019-08-02 02:02发布

在PowerShell中,你怎么管一个命令的输出到剪贴板,但

  • 还是能管的数据多个进程
  • 外部应用程序,如无依赖clip.exe
  • 它的工作作为过滤器,所以我们立即看到在命令行上输出

编辑: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

Answer 1:

如果你有WMF 5.0,PowerShell中包含了两个新的cmdlet:

获取剪贴板并设置剪贴板



Answer 2:

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

这里是我的解决方案:

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 。 我们使用三通对象当前元素重定向, $_ ,这两个下道工序,然后存放在数组, $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 )
    }
}


Answer 3:

PowerShell的6.1版删除了此命令行,因此它不再内置。

相反,你需要安装ClipboardText包 。 在PowerShell的控制台类型:

Install-Module -Name ClipboardText

然后你可以使用:

 Set-ClipboardText "hello clipboard"
 Get-ClipboardText

这里是GitHub的问题使用PowerShell的重定向你使用ClipboardText包的维护者。



文章来源: Pipe output to the clipboard using PowerShell