PowerShell包装器将管道输入定向到Python脚本

我正在尝试编写一个小工具,使我可以将命令输出通过管道传递到剪贴板.我已经阅读了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.

上一篇:如何在输入特定密钥后立即退出C程序?


下一篇:linux stdbuf – line-buffered stdin选项不存在