ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-10-13 20:59:55  阅读:230  来源: 互联网

标签:python powershell stdin


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

标签:python,powershell,stdin
来源: https://codeday.me/bug/20191013/1910199.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有