我想转换基斯山C#执行情况的剪贴板和机剪贴板的纯PowerShell。PSM1文件。

有没有一种方法建立一个STA线在PowerShell,因为他不在他的Cmdlet工作时的剪贴板?

该博客
代码

有帮助吗?

解决方案

文本框不需要-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核心,并在Windows PowerShell v2-v4。

尝试汇总的事态和选项 作为的 Windows PowerShell5.1/PowerShell 核心 v6。1.0:

  • Windows PowerShell 5.0+:使用 内置 Get-ClipboardSet-Clipboard 命令。

  • Windows PowerShell v4。0- (v1-v4。0):已 没有 内置命令进行相互作用的剪贴板, 但有 解决方法:

    • 使用 PowerShell社会的扩展 (PSCX; http://pscx.codeplex.com/),其中配有几个剪贴板的相关命令的超出仅仅处理文本。
    • 标准的命令行程序 clip.exe (W2K3+服务器的端,Vista+client-side)[1]:

      • 注:除了编码问题讨论的下面 ... | clip.exe 总是 追加的一个结尾的新行 要输入;只有这样,才能避免的,是使用临时文件,其内容是提供通过 cmd's < 输入重定向的看到 Set-ClipboardText 功能如下。

      • 如果只有ASCII character(7位)支持是必要的:工作的默认。

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

        • $OutputEncoding = [System.Text.Encoding]::GetEncoding([System.Globalization.CultureInfo]::CurrentCulture.TextInfo.OEMCodePage)
      • 如果 全Unicode支持 需要一个 UTF-16勒编码 没有BOM 必须使用;运行以下第一:

        • $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 PowerShell5.1/PowerShell核心v6。0.0-rc。2-看看 https://github.com/PowerShell/PowerShell/issues/5763

        • 在非全球范围内,使用 (New-Object ...).psobject.BaseObject 工作围绕错误,或者在PSv5+使用 [...]:new() 代替。
      • 注: clip.exe 显然了解到2格式:

        • 该系统的电流 OEM codepage (例如IBM437)
        • UTF-16勒 ("Unicode")
        • 不幸的是, clip.exe 总是对待一个BOM作 数据, 因此需要使用一个BOM 编码。
        • 请注意,上述编码问题只相对于正确检测 输入;一旦上了 剪贴板, ,输入串的提供 所有 以下编码:UTF-16LE,"ANSI",并OEM。
    • 使用 PowerShell为基础的解决方案的直接使用。净类:

      • 注意剪贴板访问只能发生从一线在STA(单螺纹套公寓)的模式,而不是MTA(多螺纹套公寓):

        • v3: STA是默认的 (MTA模式可以进入通过调用 powershell.exe-mta 开关)。
        • v2和v1: MTA是默认的;STA模式可以进入通过调用 powershell.exe-sta 开关。
        • 因此:强大的功能应该能够访问的剪贴板从会议中的任一种模式。
  • PowerShell 核心 (多平台), 作为的v6。1.0, 已 没有 内置命令进行相互作用的剪贴板, 不时甚至在运行 Windows.

    • 的解决方法是使用特定平台公用事业或Api-见下文。

ClipboardText 模块 提供 "提供填充代码"功能 Get-ClipboardTextSet-ClipboardText 为获取和设置 文本 从剪贴板;他们的工作 Windows PowerShell v2+ 以及 PowerShell核心 (与限制,见下文)。

在最简单的情况(PSv5+或3/v4与包,管理模块的安装),可以 安装它 从PowerShell画廊 从提升/ sudo 会议如下:

Install-Module ClipboardText

更多的信息,包括先决条件和手册的安装说明,请参阅 repo.

  • 注:严格来说,该职能是不是 polyfills, 鉴于他们的姓名不同的内置命令。然而,该名后缀 文本 被选中,以便使其明确的是,这些功能处理文本只。

  • 代码感激地建立在信息从各种网站,特别是@hoge的答复(https://stackoverflow.com/a/1573295/45375)和 http://techibee.com/powershell/powershell-script-to-copy-powershell-command-output-to-clipboard/1316

  • 上运行 Windows PowerShell5+在STA模式:

    • 内建cmdlet(Get-Clipboard / Set-Clipboard)是称为幕后。
      注意STA模式(a COM线程模型)是默认,因为v3,但你可以选择进入MTA(多线程的模式)有命令行选项 -MTA.
  • 在所有其他案件(Windows PowerShell v4和/或在MTA模式的文件 核心 在所有支持平台):

    • Windows:
      • P/援引为基础的解决方案,呼吁Windows API用,通过特设C#码编制 Add-Type.
    • Unix平台:本地公用事业被称为幕后:
      • mac os: pbcopypbpaste
      • Linux: xclip, 如果 提供和安装;
        例如,Ubuntu,使用 sudo apt-get xclip 安装。
  • Set-ClipboardText 可以 接受 任何类型 的对象(s)作为输入 (这是/,然后转换为文本相同的方式呈现在控制台),或者是直接的,或者从管道。

  • 援引用 -Verbose 看到什么样的技术是使用的场景背后的访问的剪贴板。


[1]早先版本的答案错误地声称, clip.exe:
-总是添加一条线打破当复制到剪贴板(不)
-正确处理UTF-16LE在Bom 文件 重定向到stdin通过 < 与当输入是通过管道输送的 | (clip.exe 总是 副本的物料清单的剪贴板、太)。

您应该首先检查您的主机。 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线程。

看看李霍姆的菜谱从PowerShell食谱: 设置-剪贴板.你可以使用在定-剪贴板。ps1,或者只是代码内PowerShell功能(这里有一个例子 从我PowerShell profile)。

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

dir | Set-Clipboard

我最初了解到的李*霍姆的解决方案,从 这个答案.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top