Подтвердить что ты не робот

Вывод трубы в буфер обмена с помощью PowerShell

В PowerShell, как вы передаете вывод команды в буфер обмена, но

  • По-прежнему можно передавать данные на большее количество процессов.
  • Никаких зависимостей от внешних приложений, таких как clip.exe
  • чтобы он работал как фильтр, поэтому мы сразу видим вывод в командной строке.

?

РЕДАКТИРОВАТЬ: 14 мая 2015 г.

Через 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
4b9b3361

Ответ 1

Если у вас WMF 5.0, PowerShell содержит два новых командлета:

get-clipboard и set-clipboard

Ответ 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. Мы используем 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 )
    }
}

Ответ 3

Взгляните на рецепт Lee Holme из Cookbook PowerShell: Set-Clipboard. Вы можете использовать это как Set-Clipboard.ps1 или просто отбросить код внутри функции PowerShell (вот пример из моего профиля PowerShell). Разумеется, он не автоматически выводит результат, но это должно быть достаточно легко добавить.

Я изначально узнал о решении Ли Холме из этого ответа.

Ответ 4

Powershell версии 6.1 удалил этот командлет, поэтому он больше не является встроенным.

Вместо этого вам нужно установить пакет ClipboardText. В консоли типа Powershell:

Install-Module -Name ClipboardText

Тогда вы можете использовать:

 Set-ClipboardText "hello clipboard"
 Get-ClipboardText

Вот проблема github с сопровождающими Powershell, которые перенаправляют вас на использование пакета ClipboardText.