转换基思·希尔的PowerShell中获取剪贴板和Set-剪贴板到PSM1脚本(Convert Ke

2019-08-18 02:12发布

我想获取剪贴板和设置剪贴板的基思·希尔的C#实现转换为纯PowerShell中为名为.psm1文件。

有没有办法运转起来STA线程在PowerShell中,他与剪贴板工作时,确实在他的Cmdlet的?

博文
代码

Answer 1:

文本框不需要-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()
}


Answer 2:

见一个底部横版,跨平台的模块 ,提供的PowerShell核心和Windows PowerShell v2中的剪贴板文本支持- V4。

试图总结事务和选项的状态的Windows PowerShell V5.1 / PowerShell 核心 V6.1.0的

  • Windows PowerShell中V5.0 +:使用内置的 Get-ClipboardSet-Clipboard的cmdlet。

  • Windows PowerShell中v4.0-(V1 - V4.0):具有与剪贴板交互没有内置的cmdlet,但也有变通方法

    • 使用PowerShell的社区扩展 (PSCX; http://pscx.codeplex.com/ ),配备了超越只是处理文本几剪贴板相关的cmdlet。
    • 管到标准命令行实用程序clip.exe (W2K3 +服务器端,Vista的+客户端)[1]:

      • 注:除了下面讨论的编码问题, ... | clip.exe ... | clip.exe总是追加尾随换行符到输入; 避免,唯一的办法就是使用一个临时文件,其内容通过CMD的提供<输入重定向-看到Set-ClipboardText以下功能。

      • 如果只需要ASCII字符(7位)支援:默认情况下。

      • 如果只有OEM编码(8位)的支持 (例如,IBM437在美国)是必要的,运行下面的第一:

        • $OutputEncoding = [System.Text.Encoding]::GetEncoding([System.Globalization.CultureInfo]::CurrentCulture.TextInfo.OEMCodePage)
      • 如果需要完全支持Unicode, 无BOM一个UTF-16 LE编码必须被使用; 先运行以下内容:

        • $OutputEncoding = New-Object System.Text.UnicodeEncoding $false, $false # UTF-16 encoding *without BOM*
        • 例如与测试(PS控制台将显示亚洲字符为“ - ”,但仍然正确处理它们-验证在记事本中剪贴板中的内容,例如。):

          • "I enjoyed Thomas Hübl's talk about 中文" | clip # should appear as is on the clipboard
      • 注:分配至$OutputEncoding如上在全球范围内正常工作,而不是其他,如在功能 ,由于是Windows PowerShell中V5.1 / PowerShell核心V6.0.0-rc.2的错误 -看到的https: //github.com/PowerShell/PowerShell/issues/5763

        • 在非全球范围内,使用(New-Object ...).psobject.BaseObject解决的bug,或者-在PSv5 + -使用[...]:new()来代替。
      • 注: clip.exe显然明白2种格式:

        • 系统当前的OEM代码页 (例如,IBM 437)
        • UTF-16 LE( “统一”)
        • 不幸的是, clip.exe始终把BOM的数据 ,因此需要使用BOM- 编码。
        • 注意,上面的编码关系仅相对于正确地检测输入 ; 一旦在剪贴板中,输入字符串是在以下所有编码可用:UTF-16 LE,“ANSI”,和OEM。
    • 使用与直接使用.NET类的基于PowerShell的解决方案

      • 请注意,剪贴板访问只能从STA(单线程单元)模式的线程发生 - 而不是MTA(多线程单元):

        • V3:STA是默认 (MTA模式可以通过调用被输入powershell.exe-mta开关)。
        • V2和V1:MTA是默认的 ; STA模式可以通过调用被输入powershell.exe-sta开关。
        • 人机工程学:强大的功能,应该能够从会话访问剪贴板在任一模式。
  • PowerShell 核心 (多平台), 为V6.1.0的 ,具有与剪贴板 ,即使是在Windows上运行的互动没有内置的cmdlet。

    • 解决方法是使用特定于平台的实用程序或API - 见下文。

ClipboardText模块提供了“填充工具”功能Get-ClipboardTextSet-ClipboardText用于获取和设置从剪贴板文本 ; 他们于Windows PowerShell V2 +以及对PowerShell的核心工作(有限制,见下文)。

在最简单的情况下(PSv5 +或V3 / V4安装了包管理模块),可以安装它从PowerShell的廊从提升/ sudo会话如下

Install-Module ClipboardText

欲了解更多信息,包括先决条件和手动安装说明,请参阅回购 。

  • 注:严格来说,功能不polyfills,因为他们的名字从内置的cmdlet不同。 然而,选择后缀名的文本 ,以使其明确,这些函数只处理文本。

  • 该代码感激地建立在各种网站的信息,特别是@霍格的答案( https://stackoverflow.com/a/1573295/45375 )和http://techibee.com/powershell/powershell-script-to-copy-powershell-指令输出到剪贴板/ 1316

  • 运行于Windows PowerShell V5在STA模式+:

    • 内置的cmdlet( Get-Clipboard / Set-Clipboard )被称为幕后。
      需要注意的是STA模式(COM线程模型)是因为V3默认的,但你可以选择到MTA(多线程模式)使用命令行选项-MTA
  • 在其他情况下(Windows PowerShell中V4-和/或MTA模式,PowerShell 核心所有支持的平台上):

    • 视窗:
      • AP / Invoke的基于解决方案,调用Windows API时,通过编译即席C#代码Add-Type
    • 类Unix平台:原生工具分别被称为幕后:
      • MACOS: pbcopypbpaste
      • Linux操作系统: xclip如果有和安装 ;
        例如,在Ubuntu上,使用sudo apt-get xclip安装。
  • Set-ClipboardText可以接受任何类型的对象(一个或多个)作为输入的 (这是/然后被转换成文本它们会使在控制台中相同的方式),或者直接地或从管道。

  • 与调用-Verbose ,看看有什么技术被用来在后台访问剪贴板。


[1]这个答案的早期版本不正确地声称clip.exe
-复制到剪贴板(不)时,总是附加一个换行符
-正确处理UTF-16 LE的BOM中经由重定向到标准输入文件 <当输入经由管道与| clip.exe 总是复制BOM到剪贴板,太)。



Answer 3:

我只是在博客如何做到这一点:

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

-Oisin



Answer 4:

你应该首先检查你的主机。 ISE已经运行STA所以没有必要旋转起来另一个线程或掏出(这是一个优化这是我的PSCX待办事项列表)。 对于控制台提示符,这是MTA,那么我掏出到二进制代码或者作为[287]莪示出或使用简单的小C#应用程序,如:

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

而对于获取剪贴板中的内容,Vista和以后有clip.exe。

我不认为,即使2.0的先进功能,是准备让乡亲们聚会在一个脚本自己的.NET线程。



Answer 5:

看看从PowerShell的食谱李霍姆的食谱: 设置剪贴板 。 您可以为SET-Clipboard.ps1使用,或只是下降一个PowerShell函数里面的代码( 在这里是一个例子 ,从我的PowerShell配置文件)。

该脚本可以让你得到充分的管道输出到剪贴板,例如:

dir | Set-Clipboard

我最初得知李某从奥尔梅的解决方案这个答案 。



文章来源: Convert Keith Hill's PowerShell Get-Clipboard and Set-Clipboard to a PSM1 script