我正在尝试编写一个小工具,使我可以将命令输出通过管道传递到剪贴板.我已经阅读了Stack Overflow上的multiple answers,但是它们对我不起作用,因为它们不包括管道,或者因为它们不使用函数,或者它们只是抛出错误(或者我只是搞砸了) ).我举起了PowerShell的手,决定选择Python.
我创建了一个名为copyToClipboard.py的Python脚本:
import sys
from Tkinter import Tk
if sys.stdin.isatty() and len(sys.argv) == 1:
#We're checking for input on stdin and first argument
sys.exit()
tk = Tk()
tk.withdraw()
tk.clipboard_clear()
if not sys.stdin.isatty():
#We have data in stdin
while 1:
try:
line = sys.stdin.readline()
except KeyboardInterrupt:
break
if not line:
break
tk.clipboard_append(line)
elif len(sys.argv) > 1:
for line in sys.argv[1]:
tk.clipboard_append(line)
tk.destroy()
(我尚未完全测试argv [1]部分,因此可能有些不稳定.我主要是对从stdin进行读取感兴趣,因此重要的部分是sys.stdin.)
这很棒!当我进入包含脚本的目录时,可以执行以下操作:
ls | python copyToClipboard.py
ls的内容神奇地出现在我的剪贴板上.那正是我想要的.
挑战在于将其包装在PowerShell函数中,该函数将采用管道输入并将输入简单地传递给Python脚本.我的目标是能够做ls |剪贴板外,所以我创建了类似以下内容:
function Out-ClipBoard() {
Param(
[Parameter(ValueFromPipeline=$true)]
[string] $text
)
pushd
cd \My\Profile\PythonScripts
$text | python copyToClipboard.py
popd
}
但这是行不通的. $text的只有一行进入了Python脚本.
如何构造PowerShell脚本的包装器,以便将以stdin形式接收的内容简单地以stdin形式传递给Python脚本?
解决方法:
首先,在PowerShell中,多行文本是一个数组,因此您需要一个[String []]参数.要解决您的问题,请尝试使用流程块:
function Out-ClipBoard() {
Param(
[Parameter(ValueFromPipeline=$true)]
[String[]] $Text
)
Begin
{
#Runs once to initialize function
pushd
cd \My\Profile\PythonScripts
$output = @()
}
Process
{
#Saves input from pipeline.
#Runs multiple times if pipelined or 1 time if sent with parameter
$output += $Text
}
End
{
#Turns array into single string and pipes. Only runs once
$output -join "`r`n" | python copyToClipboard.py
popd
}
}
我自己这里没有Python,因此无法对其进行测试.当您需要通过管道传递多个项目(数组)时,需要PowerShell的流程块来处理它.有关过程块和高级功能的更多信息是at TechNet.