คัดลอกไปยังคลิปบอร์ดใน Node.js?


93

มีวิธีคัดลอกไปยังคลิปบอร์ดใน Node.js หรือไม่? โมดูลหรือแนวคิดใด ๆ ที่เคยมีมา ฉันใช้ Node.js บนแอปพลิเคชันบนเดสก์ท็อป หวังว่าจะกระจ่างขึ้นว่าทำไมฉันถึงต้องการให้มันบรรลุเป้าหมายนี้

คำตอบ:


19

คลิปบอร์ดไม่ได้มีอยู่ในระบบปฏิบัติการ เป็นการสร้างระบบหน้าต่างใด ๆ ที่ระบบปฏิบัติการกำลังทำงานอยู่ ดังนั้นหากคุณต้องการให้สิ่งนี้ใช้ได้กับ 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);
});

การมีสำเนาเทียบเท่าโครเมียม () จะดีมาก

96

สำหรับ OS X:

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

write()สามารถใช้บัฟเฟอร์หรือสตริง การเข้ารหัสเริ่มต้นสำหรับสตริงจะเป็น utf-8


สิ่งนี้มีประโยชน์มากสำหรับการแปลงข้อมูลอย่างรวดเร็วใน REPL
William

80

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ในไซเปรสฉันมีปุ่มในเว็บแอปพลิเคชันของฉันเมื่อคลิกที่ปุ่มนั้นควรจะได้รับเนื้อหาคลิปบอร์ด แต่ให้ไม่ได้กำหนดอินพุตใด ๆ ที่ได้รับความนิยมมากstackoverflow.com/questions/61650737/…
soccerway

31

นี่คือโมดูลที่มีให้copyและpasteทำหน้าที่: 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
Towc

18

วิธีที่สั้นที่สุดใน Windows:

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

1
ได้ผล! ขอบคุณ ... แต่ต้องขอutilก่อน
LIXer

2
ขอบคุณ! ไม่จำเป็นต้องพึ่งพา "util" สำหรับฉันแบบนั้น: ต้องใช้ ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard");
darmis

ฉันได้รับReferenceError: util is not definedโดยไม่ต้องก่อนรวมถึงconst util = require("util")ฉันทดสอบทั้งใน Electon main และ render process โดยไม่มีโชค ที่กล่าวจากโหนด 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

ฉันใช้คำสั่ง 'echo "test foo bar" | คลิป 'มันใช้งานได้ แต่ผลลัพธ์มีเส้นแบ่ง \ n มันทำให้งานของฉันพัง ...
LIXer

3

Mac มีบรรทัดคำสั่งดั้งเดิมpbcopyสำหรับกรณีการใช้งานนี้:

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

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

รหัสเดียวกันสำหรับ Linux แต่แทนที่pbcopyด้วยXclip ( apt get install xclip)


น่าสนใจ! คุณคิดว่ามีวิธี Windows ในการทำเช่นนี้ด้วยหรือไม่? และสิ่งที่เกี่ยวกับการรวม xclip ในโปรแกรมของฉันเนื่องจากฉันไม่ต้องการขอให้ผู้ใช้ติดตั้ง xclip
ทาวเวอร์

1
ผมพบว่ามีบางสิ่งบางอย่างใน echo fooo | clipWindows: ตอนนี้จะมีสิ่งนี้ใน Linux ได้อย่างไรโดยไม่ต้องขอให้ผู้ใช้ติดตั้งอะไร
ทาวเวอร์

echo fooo | clipสามารถใช้งานได้ แต่ผลลัพธ์จะมี '\ n' ที่ท้ายสุดของสตริง primal ซึ่งเป็นไปตามที่ฉันคาดไว้
LIXer

-5

ตรวจสอบzeroclipboardนี้

npm ติดตั้ง zeroclipboard


สิ่งนี้ดูเหมือนจะเป็นสำหรับเบราว์เซอร์ไม่ใช่แอปพลิเคชันเดสก์ท็อป NodeJS
Scott Rippey

1
นอกจากนี้ยังใช้แฟลชซึ่งดูเหมือนจะเป็นความคิดที่ไม่ดี
CallMeNorm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.