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
}

しかし、それはうまくいきません。$textPythonスクリプトにたどり着くのは1行だけです。

stdinPowerShellスクリプトのラッパーを構造化して、受け取ったものがすべてPythonスクリプトに渡されるようにするにはどうすればよいstdinですか?

4

1 に答える 1