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