转换基斯山的PowerShell让-剪贴板和机剪贴板一PSM1脚本
-
21-09-2019 - |
解决方案
文本框不需要-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-Clipboard
和Set-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
开关。 - 因此:强大的功能应该能够访问的剪贴板从会议中的任一种模式。
- v3: STA是默认的 (MTA模式可以进入通过调用
PowerShell 核心 (多平台), 作为的v6。1.0, 已 没有 内置命令进行相互作用的剪贴板, 不时甚至在运行 Windows.
- 的解决方法是使用特定平台公用事业或Api-见下文。
我 ClipboardText
模块 提供
"提供填充代码"功能 Get-ClipboardText
和 Set-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
.
- 内建cmdlet(
在所有其他案件(Windows PowerShell v4和/或在MTA模式的文件 核心 在所有支持平台):
- Windows:
- P/援引为基础的解决方案,呼吁Windows API用,通过特设C#码编制
Add-Type
.
- P/援引为基础的解决方案,呼吁Windows API用,通过特设C#码编制
- Unix平台:本地公用事业被称为幕后:
- mac os:
pbcopy
和pbpaste
- Linux:
xclip
, 如果 提供和安装;
例如,Ubuntu,使用sudo apt-get xclip
安装。
- mac os:
- Windows:
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线程。