Преобразование PowerShell Get-Clipboard кита Хилла и Set-Clipboard в скрипт PSM1

Я хотел бы преобразовать реализацию C# кита Хилла Get-Clipboard и Set-Clipboard в чистый PowerShell как a .Файл PSM1.

есть ли способ развернуть поток STA в PowerShell, как он делает в своем Командлете при работе с буфером обмена?

В Блоге
Код

5 ответов


TextBox не требует-STA переключатель.

function Get-ClipBoard {
    Add-Type -AssemblyName System.Windows.Forms
    $tb = New-Object System.Windows.Forms.TextBox
    $tb.Multiline = $true
    $tb.Paste()
    $tb.Text
}


function Set-ClipBoard() {
    Param(
      [Parameter(ValueFromPipeline=$true)]
      [string] $text
    )
    Add-Type -AssemblyName System.Windows.Forms
    $tb = New-Object System.Windows.Forms.TextBox
    $tb.Multiline = $true
    $tb.Text = $text
    $tb.SelectAll()
    $tb.Copy()
}

смотрите нижнюю часть для кросс-издание, кросс-платформенный модуль, который находится буфер обмена текст поддержка в PowerShell Core и Windows PowerShell v2 - v4.

попытка суммировать положение дел и варианты по состоянию на Windows PowerShell v5.1 / PowerShell базовый В6.1.0:

  • Windows в PowerShell У5.0+ используйте встроенный Get-Clipboard и Set-Clipboard командлетов.

  • Windows PowerShell В4.0- (v1-v4.0): имеет нет встроенные командлеты для работы с буфером обмена, а есть решения:

    • использовать Сообщество PowerShell Расширения (PSCX;http://pscx.codeplex.com/), которые поставляются с несколькими командлетами, связанными с буфером обмена, которые выходят за рамки просто обработки текста.
    • трубы стандартная утилита командной строки clip.exe (w2k3+ на стороне сервера, Vista + на стороне клиента)[1]:

      • Примечание: Помимо вопросов кодирования, обсуждаемых ниже,... | clip.exe всегда добавляет пустую строку к входу; единственный способ избежать этого-использовать временный файл, содержимое которого осуществляется через cmd ' s < перенаправление ввода - см.


Я только что написал в блоге, как это сделать:

http://www.nivot.org/2009/10/14/PowerShell20GettingAndSettingTextToAndFromTheClipboard.aspx

- Oisin


сначала проверьте хост. ISE уже запускает STA, поэтому нет необходимости раскручивать другой поток или оболочку (это оптимизация, которая находится в моем списке задач для PSCX). Для командной строки консоли, которая является MTA, я бы выложил двоичный код, как показывает Oisin, или использовал простое маленькое приложение c#, такое как:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
class OutClipboard {
  [STAThread]
  static void Main() {
    Clipboard.SetText(Console.In.ReadToEnd());
  }
}

и для получения содержимого буфера обмена Vista и более поздние версии имеют клип.исполняемый.

Я не думаю, что даже расширенные функции 2.0 готовы пусть люди веселятся со своими собственными потоками .NET в скрипте.


взгляните на рецепт ли холма из Поваренной книги PowerShell:Set-Clipboard. Вы можете использовать at как Set-Clipboard.ps1 или просто поместите код внутри функции PowerShell (вот пример из моего профиля PowerShell).

скрипт позволит вам получить полный вывод в буфер обмена, например:

dir | Set-Clipboard

Я первоначально узнал о решении ли холма от ответ.