PowerShell的包装直接管道输入到Python脚本(PowerShell wrapper to

2019-08-08 06:52发布

我试图写一个小工具,可以让我管命令输出到剪贴板。 我已经通过阅读多个 答案对堆栈溢出,但他们并没有为我工作,因为他们没有包括管道,或者是因为他们没有使用的功能,或者他们只是把错误(或者也许我只是搞砸)。 我把我的手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 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

Answer 1:

首先,在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 。



文章来源: PowerShell wrapper to direct piped input to Python script