如何在Windows命令行中将文件(而不是内容)复制/剪切到剪贴板?

18

有没有一种方法可以通过命令行将文件复制(或剪切)到Windows剪贴板中?

尤其是在批处理脚本中。我知道如何将内容复制到剪贴板(type file | clip),但这并不是我想要的。我希望像在Windows资源管理器中按下Ctrl + C那样,整个文件都被复制到剪贴板中。


请看这里:http://serverfault.com/questions/162273/how-to-send-a-file-into-clipboard-from-command-line-cli - cb0
1
@cb0 请查看您链接的主题中的评论 - Endoro
6个回答

15

好的,似乎最简单的方法是创建一个小的C#工具,它接收参数并将其存储在剪贴板中:

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年更新:这里有一个GitHub资料库,包含源代码和二进制文件。


1
谢谢,这太棒了,我已经寻找类似的东西很长一段时间了。顺便说一下,在意识到我已经在 c:\Windows\Microsoft.NET 下有一个 C# 编译器之前,我花了两天时间弄清楚是否可以在 vb 中完成这个任务。 - Miserable Variable
2
如果其他答案都没有回答你的问题,你应该接受这个答案,即使它是你自己的,这样我们其他人就可以更容易地找到答案。 - Museful
1
好的解决方案。对于我的使用,我将此实用程序添加为“fileclip.exe”到系统路径中。从路径中使用它时,我不得不将System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0])更改为System.IO.Directory.GetCurrentDirectory()以使相对路径正常工作。 - John McCarthy

7
这将把文件内容放入剪贴板中(通过clip.exe完成)。
type \path\to\file|clip

为了获取实际文件,您可能需要使用其他编程语言(如VBScript或PowerShell)来访问Windows API。我不确定当您按下CTRL+C复制文件时,资源管理器会将什么放入剪贴板。我怀疑它使用通知系统来执行比在那里放置文件路径更智能的操作。根据CTRL+V的上下文,您将获得某些内容(资源管理器、Word)或没有任何内容(记事本)。

3

我一直希望在Emacs中使用这个功能,因此受到这个问题的启发,找到了一个答案(这里),并且写了一个C语言版本,可在以下网址查看:

https://github.com/roryyorke/picellif

picellif还可以处理通配符(对我来说不清楚rostok的C#版本是否可以)。


我也想在Emacs和其他命令行中使用它 :) 我一直在使用rostok上面的C#代码,但如果你有Windows二进制文件,我很乐意使用它,只是因为你编写了Emacs使用。 - Miserable Variable
@MiserableVariable 在 GitHub 上有 Windows 二进制文件(请查看发布选项卡)。我已经使用了0.2.0版本三个星期,没有发现任何错误。 - Rory Yorke
哎呀,不知道我怎么错过了。现在你又多了一个用户 :) - Miserable Variable
嗨 Roy,只是想让你知道这非常有用,我正在使用相同名称picellif,希望有一天能够记住它的名称,而不必总是通过ls /usr/local/bin来查找。 - Miserable Variable
@MiserableVariable 是的,不幸的是,“fileclip”这个名称已经被使用了。Emacs 25将具有可加载模块(默认情况下禁用),我想将其重写为这样的模块;在Windows上,进程启动时间可能会使picellif在第一次使用时变得非常缓慢。 - Rory Yorke
在Cygwin中,使用winpty picellif your_file_to_copy.exe - John Chain

2

You can try 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.

例子:将反斜杠转换为正斜杠。假设您在记事本中打开以下文本:

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

如果出于某种原因,您需要将第一行格式化为以下格式:

foo\bar\systems\alpha1.cpp

那么您可以这样做:

然后您可以这样做:

  1. Mark the first line using SHIFT + CURSOR keys.
  2. Press Ctrl + C or Ctrl + Insert to copy it into clipboard
  3. On the Windows command line, run this command (for example, from a batch file):

    sfk fromclip +filter -rep x/x\x +toclip
    
  4. Back in the editor, press Ctrl + V or Shift + Insert, pasting the result from the clipboard.

正如您所看到的,该行变成了"foo\bar\systems\alpha1.cpp"。

2

copymove 是批处理命令之一,用于分别复制/粘贴和剪切/粘贴文件。我们在处理文件时不使用paste或cut术语,但如果我理解您的意思,需要将文件复制到另一个位置并将文件移动到另一个位置。


1
不,这不是关于文件复制(复制、xcopy、移动等都很基本)。问题是如何将文件放入系统剪贴板中。 - rostok
好的。我想如果我们了解文件类型以及它是如何被使用的,有人可能会有帮助的想法。 - foxidrive

0
你可以使用{{link1:Sid's Bytestream上的命令行复制和粘贴文件实用程序}}。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接