2013-06-19 24 views
9

Có cách nào để sao chép (hoặc cắt) tệp vào khay nhớ tạm của Windows từ dòng lệnh không?Làm thế nào để sao chép/cắt một tập tin (không phải là nội dung) vào clipboard trong Windows trên dòng lệnh?

Cụ thể với tập lệnh theo lô. Tôi biết cách sao chép nội dung vào clipboard (type file | clip), nhưng đây không phải là trường hợp. Tôi muốn có toàn bộ tệp như tôi sẽ nhấn Ctrl + C trong Windows Explorer.

+0

Hãy xem tại đây http://serverfault.com/questions/162273/how-to-send-a-file-into-clipboard-from-command-line-cli – cb0

+1

@ cb0 vui lòng xem [nhận xét] (http://serverfault.com/a/162275) đến chuỗi bạn đã liên kết. – Endoro

+0

có thể trùng lặp của [Có API Windows để lập trình Cắt/Sao chép/Dán tệp qua Explorer không?] (Http://stackoverflow.com/questions/9845056/is-there-a-windows-api-to-programmatically-cut -opy-paste-files-via-explorer) – Synetech

Trả lời

2

Bạn có thể thử Swiss File Knife (SFK):


sfk toclip 
Copy stdin to clipboard as plain text. 

    type test.txt | sfk toclip 
     Copies the content of ASCII file test.txt into the clipboard. 

    sfk list | sfk toclip 
     Copies a file listing of the current dir into the clipboard. 

sfk fromclip [-wait] [-clear] 

Dump plain text content from the clipboard to the terminal. 

    -wait : block until plain text is available. 
    -clear: empty the clipboard after reading it. 

Ví dụ: biến backslashes vào dấu gạch chéo. Hãy tưởng tượng bạn có văn bản sau đây mở trong vòng Notepad:

foo/bar/systems/alpha1.cpp 
foo/bar/systems/alpha2.cpp 
foo/bar/systems/beta1.cpp 

Và đối với một số lý do bạn cần dòng đầu tiên trong một định dạng như thế này:

foo\bar\systems\alpha1.cpp 

Sau đó, bạn có thể làm theo cách này:

  1. Đánh dấu dòng đầu tiên bằng cách sử dụng phím SHIFT + CURSOR.
  2. Nhấn Ctrl + C hay Ctrl + Chèn để sao chép nó vào clipboard
  3. Trên dòng lệnh của Windows, chạy lệnh này (ví dụ, từ một tập tin batch):

    sfk fromclip +filter -rep x/x\x +toclip 
    
  4. Quay lại trình chỉnh sửa, nhấn Ctrl + V hoặc Shift + Chèn, dán kết quả từ khay nhớ tạm.

Như bạn thấy, dòng đã thay đổi thành "foo \ bar \ systems \ alpha1.cpp".

2

copymove là (một số) lệnh batch sao chép/dán và cắt/dán tệp tương ứng. Chúng tôi không sử dụng cụm từ dán hoặc cắt khi xử lý tệp nhưng nếu tôi hiểu bạn cần phải sao chép tệp sang vị trí khác và di chuyển tệp đến vị trí khác.

+1

không, đây không phải là về việc sao chép tập tin (sao chép, xcopy, di chuyển vv là khá cơ bản). vấn đề là về cách đặt tệp vào khay nhớ tạm của hệ thống. – rostok

+0

Ok. Tôi đoán nếu chúng ta hiểu loại tệp và cách nó được sử dụng thì ai đó có thể có ý tưởng giúp đỡ. – foxidrive

4

Điều này sẽ đặt nội dung của tệp vào khay nhớ tạm (được thực hiện bởi clip.exe).

type \path\to\file|clip 

Để lấy tệp thực, bạn có thể phải sử dụng một số ngôn ngữ lập trình khác, như VBScript hoặc PowerShell để truy cập vào Windows API. Tôi không hoàn toàn chắc chắn những gì Explorer đưa vào clipboard khi bạn CTRL + C một tập tin. Tôi nghi ngờ nó sử dụng hệ thống thông báo để làm một cái gì đó thông minh hơn đặt đường dẫn đến tập tin đó. Tùy thuộc vào ngữ cảnh của CTRL + V, bạn sẽ nhận được một cái gì đó (Explorer, Word) hoặc không có gì (Notepad).

9

OK, có vẻ như là cách dễ nhất là tạo ra một công cụ # C nhỏ mà lấy đối số và lưu trữ chúng trong clipboard:

using System; 
using System.Windows.Forms; 
using System.Collections.Generic; 
using System.Collections.Specialized; 

namespace File2Clip 
{ 
    public class App 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      List<string> list = new List<string>(); 

      string line; 
      while(!string.IsNullOrEmpty(line = Console.ReadLine())) list.Add(line); 
      foreach (string s in args) list.Add(s); 

      StringCollection paths = new StringCollection(); 
      foreach (string s in list) { 
      Console.Write(s); 
       paths.Add( 
        System.IO.Path.IsPathRooted(s) ? 
         s : 
         System.IO.Directory.GetCurrentDirectory() + 
         @"\" + s); 
      } 
      Clipboard.SetFileDropList(paths); 
     } 
    } 
} 

2017 chỉnh sửa: Đây là một github repo với cả hai nguồn và nhị phân.

+1

Cảm ơn bạn, điều này là tuyệt vời và tôi đã tìm kiếm một cái gì đó như thế này trong một thời gian dài. BTW Tôi đã dành hai ngày để tìm ra nếu tôi có thể làm điều này trong vb trước khi nhận ra tôi đã có một trình biên dịch 'C#' ở đâu đó bên dưới 'c: \ Windows \ Microsoft.NET' –

+1

Nếu không có câu trả lời nào khác trả lời câu hỏi của bạn, bạn nên chấp nhận câu trả lời này, ngay cả khi nó là của riêng bạn, để chúng tôi những người khác có thể tìm thấy câu trả lời dễ dàng hơn. – Museful

+0

Giải pháp tốt. Đối với việc sử dụng của tôi, tôi đã thêm tiện ích này dưới dạng 'fileclip.exe' vào đường dẫn hệ thống. Sử dụng nó từ đường dẫn, tôi phải thay đổi 'System.IO.Path.GetDirectoryName (Environment.GetCommandLineArgs() [0])' thành 'System.IO.Directory.GetCurrentDirectory()' cho các đường dẫn tương đối để làm việc. –

1

tôi đã mãi mãi muốn điều này để sử dụng trong Emacs, vì vậy, lấy cảm hứng từ câu hỏi này, một câu trả lời here, và một lượng ma đẹp của NIH hội chứng, tôi đã viết một phiên bản C có sẵn tại

https://github.com/roryyorke/picellif

picellif cũng xử lý ký tự đại diện (nó không phải là rõ ràng với tôi nếu C# phiên bản Rostok của không hay không).

+0

Tôi muốn nó cho Emacs và dòng lệnh khác sử dụng quá :) Tôi đã sử dụng mã C# từ câu trả lời của rostok ở trên nhưng nếu bạn có windows nhị phân tôi sẽ vui vẻ sử dụng thay vào đó, chỉ vì bạn đã viết nó Emacs sử dụng. –

+0

@MiserableVariable Có các cửa sổ nhị phân tại github (xem trong tab phát hành). Tôi đã sử dụng 0.2.0 trong ba tuần qua mà không nhận thấy lỗi. –

+0

Rất tiếc, không biết tôi đã bỏ lỡ nó như thế nào. Bây giờ bạn có thêm một người dùng :) –

Các vấn đề liên quan