16

Is there a way to copy (or cut) a file to the Windows clipboard from the command line?

In particular with a batch script. I know how to copy the contents to the clipboard (type file | clip), but this is not the case. I want to have the whole file as I would press Ctrl + C in Windows Explorer.

4

7 回答 7

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 存储库。

于 2013-06-27T22:44:49.387 回答
7

这会将文件的内容放入剪贴板(由clip.exe 完成)。

type \path\to\file|clip

要获取实际文件,您可能不得不求助于其他一些编程语言,如 VBScript 或 PowerShell 来访问 Windows API。当您 CTRL+C 文件时,我不完全确定 Explorer 将什么放入剪贴板。我怀疑它使用通知系统做一些比将文件路径放在那里更智能的事情。根据 CTRL+V 的上下文,您会得到一些东西(Explorer、Word)或什么都没有(记事本)。

于 2013-06-22T06:49:12.593 回答
3

我一直希望它在 Emacs 中使用,因此,受这个问题、这里的答案和大量 NIH 综合症的启发,我编写了一个 C 版本,可在

https://github.com/roryyorke/picellif

picellif 还处理通配符(我不清楚 rostok 的 C# 版本是否有)。

于 2015-04-30T08:55:38.707 回答
2

您可以试试 瑞士锉刀(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. 使用 SHIFT + CURSOR 键标记第一行。
  2. Ctrl+CCtrl+Insert将其复制到剪贴板
  3. 在 Windows 命令行上,运行以下命令(例如,从批处理文件):

    sfk fromclip +filter -rep x/x\x +toclip
    
  4. 返回编辑器,按Ctrl+VShift+ Insert,从剪贴板粘贴结果。

如您所见,该行更改为“foo\bar\systems\alpha1.cpp”。

于 2013-06-19T11:20:27.940 回答
2

copy并且move是(一些)分别复制/粘贴和剪切/粘贴文件的批处理命令。我们在处理文件时不使用术语粘贴或剪切,但如果我了解您,则需要将文件复制到另一个位置并将文件移动到另一个位置。

于 2013-06-19T13:14:02.443 回答
0

您可以在 Sid 的 Bytestream 上使用命令行复制和粘贴文件实用程序

于 2015-04-07T03:47:07.783 回答
0

我也遇到了类似的问题,为此我写了一个ahk脚本
(需要Gdip库编译)

CopyToClip.ahk:

fileName := %0%

if( !FileExist(fileName) )
{
    MsgBox, %fileName% not found!
    return
}

;MsgBox, %fileName%
file := FileOpen(fileName, "r")
if( ErrorLevel )
{
    MsgBox, Open %fileName% error!
    return
}
encoding := File.Encoding
fileSize := File.Length


; Read as text?
readAs := "unkonw"
SplitPath, fileName, name, dir, ext, name_no_ext, drive
if( ext == "txt" || ext == "md" || ext == "bat" || ext == "cmd" || ext == "ahk" || ext == "ini" || ext == "sfo")
{
    readAs := "text"
}
else if( ext == "png" || ext == "jpg" || ext == "jpeg" || ext == "xbt" || ext == "img" )
{
    readAs := "image"
}
else if( fileSize > 10240 )
{
    MsgBox, Unsupport file size %fileSize%
    return
}
else
{
    ToolTip, Unsupport file type %ext%`, but read as text.
    readAs := "text"
}
;MsgBox, %readAs%

if( readAs == "text" )
{
    fileContent := File.Read()
    Clipboard := fileContent
}
else if( readAs == "image" )
{
    pToken := Gdip_Startup()
    Gdip_SetBitmapToClipboard(pBitmap := Gdip_CreateBitmapFromFile(fileName))
    Gdip_DisposeImage(pBitmap)
    Gdip_Shutdown(pToken)
    ;file.RawRead(fileContent, fileSize)
}else
{
    MsgBox, Unkonw Error!
    return
}

if( ErrorLevel )
{
    MsgBox, Read %fileName% error!
    return
}

ToolTip, %fileName%`nSize: %fileSize%
Sleep, 400
ExitApp

编译完成后,我们可以使用CopyToClip.exe <your_file_path>将文件内容复制到剪贴板,但目前只支持文本和图片。

于 2020-11-23T10:47:18.873 回答