我想获取剪贴板和设置剪贴板的基思·希尔的C#实现转换为纯PowerShell中为名为.psm1文件。
有没有办法运转起来STA线程在PowerShell中,他与剪贴板工作时,确实在他的Cmdlet的?
博文
代码
我想获取剪贴板和设置剪贴板的基思·希尔的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 PowerShell V5.1 / PowerShell 核心 V6.1.0的 :
Windows PowerShell中V5.0 +:使用内置的 Get-Clipboard
和Set-Clipboard
的cmdlet。
Windows PowerShell中v4.0-(V1 - V4.0):具有与剪贴板交互没有内置的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种格式:
clip.exe
始终把BOM的数据 ,因此需要使用BOM- 少编码。 使用与直接使用.NET类的基于PowerShell的解决方案 :
请注意,剪贴板访问只能从STA(单线程单元)模式的线程发生 - 而不是MTA(多线程单元):
powershell.exe
与-mta
开关)。 powershell.exe
与-sta
开关。 PowerShell 核心 (多平台), 为V6.1.0的 ,具有与剪贴板 ,即使是在Windows上运行的互动没有内置的cmdlet。
我ClipboardText
模块提供了“填充工具”功能Get-ClipboardText
和Set-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模式+:
Get-Clipboard
/ Set-Clipboard
)被称为幕后。 -MTA
。 在其他情况下(Windows PowerShell中V4-和/或MTA模式,PowerShell 核心所有支持的平台上):
Add-Type
。 pbcopy
和pbpaste
xclip
, 如果有和安装 ; sudo apt-get xclip
安装。 Set-ClipboardText
可以接受任何类型的对象(一个或多个)作为输入的 (这是/然后被转换成文本它们会使在控制台中相同的方式),或者直接地或从管道。
与调用-Verbose
,看看有什么技术被用来在后台访问剪贴板。
[1]这个答案的早期版本不正确地声称clip.exe
:
-复制到剪贴板(不)时,总是附加一个换行符
-正确处理UTF-16 LE的BOM中经由重定向到标准输入文件 <
当输入经由管道与|
( clip.exe
总是复制BOM到剪贴板,太)。
我只是在博客如何做到这一点:
http://www.nivot.org/2009/10/14/PowerShell20GettingAndSettingTextToAndFromTheClipboard.aspx
-Oisin
你应该首先检查你的主机。 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的食谱李霍姆的食谱: 设置剪贴板 。 您可以为SET-Clipboard.ps1使用,或只是下降一个PowerShell函数里面的代码( 在这里是一个例子 ,从我的PowerShell配置文件)。
该脚本可以让你得到充分的管道输出到剪贴板,例如:
dir | Set-Clipboard
我最初得知李某从奥尔梅的解决方案这个答案 。