1

我正在尝试编写一个小工具,让我将命令输出通过管道传输到剪贴板。我已经阅读了 Stack Overflow 上的多个 答案,但它们对我不起作用,因为它们不包含管道,或者因为它们没有使用函数,或者它们只是抛出错误(或者我可能只是搞砸了)。我放弃了使用 PowerShell 并决定使用 Python。

我创建了一个名为的 Python 脚本copyToClipboard.py

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 | Out-Clipboard,所以我创建了类似的东西:

function Out-ClipBoard() {
    Param(
      [Parameter(ValueFromPipeline=$true)]
      [string] $text
    )
    pushd
    cd \My\Profile\PythonScripts
    $text | python copyToClipboard.py
    popd
}

但这不起作用。只有一行$text进入 Python 脚本。

如何构造我的 PowerShell 脚本的包装器,以便它接收到的任何内容都stdin简单地传递给 Python 脚本stdin

4

1 回答 1

2

首先,在 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 的进程块来处理它。有关进程块和高级功能的更多信息,请访问 TechNet

于 2013-01-26T20:29:59.380 回答