复制到Node.js中的剪贴板?


86

有没有一种方法可以复制到Node.js中的剪贴板?有什么模块或想法吗?我在桌面应用程序上使用Node.js。希望这可以弄清为什么我希望它能够实现这一目标。

Answers:


18

剪贴板不是操作系统固有的。它是操作系统恰好正在运行的任何窗口系统的构造。因此,例如,如果您希望它在X上运行,则需要绑定到Xlib和/或XCB。节点的Xlib绑定实际上存在:https : //github.com/mixu/nwm。尽管我不确定它是否使您能够访问X剪贴板,但是您可能最终会自己编写。您将需要Windows的单独绑定。

编辑:如果您想做些骇人听闻的事情,也可以使用xclip:

var exec = require('child_process').exec;

var getClipboard = function(func) {
  exec('/usr/bin/xclip -o -selection clipboard', function(err, stdout, stderr) {
    if (err || stderr) return func(err || new Error(stderr));
    func(null, stdout);
  });
};

getClipboard(function(err, text) {
  if (err) throw err;
  console.log(text);
});

铬当量的copy()会很棒。

93

对于OS X:

function pbcopy(data) {
    var proc = require('child_process').spawn('pbcopy'); 
    proc.stdin.write(data); proc.stdin.end();
}

write()可以采用缓冲区或字符串。字符串的默认编码为utf-8。


这对于REPL中的快速数据转换非常有用。
威廉

73

结帐clipboardy。它使您可以跨平台复制/粘贴。它比另一个答案中提到copy-paste模块更积极地维护,并且可以修复该模块的许多问题。

const clipboardy = require('clipboardy');

// Copy
clipboardy.writeSync('🦄');

// Paste
clipboardy.readSync();
//🦄

它比“复制粘贴”模块更好,因为它也支持双字节字符。但这在Windows 32位操作系统中存在问题。
Ponmudi VN

1
@PonmudiVN Windows 32位支持已被固定:github.com/sindresorhus/clipboardy/commit/...
的Sindre Sorhus

我做了NPM安装çlipboardy在cypress.I在我的web应用程序的按钮,在点击该按钮应该得到剪贴板中的内容,但它给未定义,任何输入都非常赞赏stackoverflow.com/questions/61650737/...
soccerway

30

下面是提供的模块copypaste功能:https://github.com/xavi-/node-copy-paste

require("copy-paste").global()被执行时,两个全局的功能添加:

> copy("hello") // Asynchronously adds "hello" to clipbroad
> Copy complete
> paste() // Synchronously returns clipboard contents
'hello'

像提到的许多其他答案一样,要复制并粘贴节点,您需要调出外部程序。对于node-copy-paste,它调出到pbcopy/pbpaste(对于OSX),xclip(对于Linux)和clip(对于Windows)。

当我在REPL中为辅助项目做大量工作时,此模块非常有用。不用说,copy-paste它只是一个命令行实用程序-并不用于服务器工作。


2
这是最好的答案。它是跨平台的,并且按应有的方式工作。
gilly3

1
出于SO政策的
考虑

16

Windows中最短的方法:

const util = require("util");
require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard"));

1
作品!谢谢...但是需要先要求util
LIXer

2
谢谢!不需要“ util”依赖对我来说是这样的:require('child_process')。spawn('clip')。stdin.end(“ content_for_the_clipboard”);
darmis

首先,我ReferenceError: util is not defined没有const util = require("util")在Electon主程序和渲染过程中进行过测试,但运气不佳。据说从节点12.14.1 CLI可以正常工作。我认为可以肯定地说您应该基于用例将util定义为安全方面。
Benargee

这几乎可行:将字符串复制为单引号。有谁知道如何防止这种行为?
m4cbeth

3

我设法通过创建另一个处理此问题的应用程序来做到这一点。当然,这不是最好的方法,但是它可以工作。

我在Windows上,创建了一个VB.NET应用程序:

Module Module1

    Sub Main()
        Dim text = My.Application.CommandLineArgs(0)
        My.Computer.Clipboard.SetText(text)
        Console.Write(text) ' will appear on stdout
    End Sub
End Module

然后在Node.js中,我曾经child_process.exec运行VB.NET应用程序,将要复制的数据作为命令行参数传递:

require('child_process').exec(
    "CopyToClipboard.exe \"test foo bar\"",

    function(err, stdout, stderr) {
        console.log(stdout); // to confirm the application has been run
    }
);

您认为您可以直接在命令行中执行此操作吗?为此编写应用程序意味着我需要针对Mac,Linux和Windows进行编译。
塔楼

@rFactor:恐怕我完全没有使用Mac / Linux的经验,并且我不知道内置的剪贴板命令。
pimvdb 2011年

我使用命令'echo“ test foo bar” | 剪辑”,它的工作原理。但是结果有换行符\ n,这打断了我的工作...
LIXer

3

Macpbcopy为此用例提供了本机命令行:

require('child_process').exec(
    'echo "test foo bar" | pbcopy',

    function(err, stdout, stderr) {
        console.log(stdout); // to confirm the application has been run
    }
);

适用于Linux的相同代码,但替换pbcopyXclipapt get install xclip


有趣!您认为也有Windows方式可以做到这一点吗?还有如何在我的程序中捆绑xclip呢,因为我不想让用户安装xclip。

1
我发现Windows中有一些内容:echo fooo | clip。现在,如何在Linux中拥有此功能而不要求用户安装某些东西?

echo fooo | clip可以工作,但是结果将在原始字符串的最后包含一个'\ n',这超出了我的预期。
LIXer

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.