在Powershell中通过剪贴板复制和粘贴文件

5

在 E:\Files 文件夹中有 2 个文件,我想将它们复制并粘贴到 D:\Dest 中:

E:\Files\

  • File1.txt
  • File2.txt

使用键盘,我只需选择这两个文件,按下 ctrl+c,在目标文件夹 D:\Dest\ 中按下 ctrl+v。

现在我想要使用 Powershell 实现这一点。因此,我将这些文件复制到剪贴板:

Set-Clipboard -Path E:\Files\*

但是现在如何将这些文件粘贴到目标文件夹中呢?显然,我需要使用Get-Clipboard。但是我不太清楚如何使用它来粘贴这些文件。

我知道我可以复制这2个文件的内容,然后使用Set-Content在D:\Dest\上创建这些文件并将内容复制到它们中。但是否有任何直接的方法呢?因为通过Set-Clipboard这些文件已经在剪贴板中了。它们只需要被粘贴。我可以使用ctrl+v,它可以工作。但我想通过Powershell将它们粘贴。有什么想法吗?


3
您使用剪贴板有特殊的原因吗?否则,我建议您使用 Copy-Item,这样更加高效。 - zett42
1
我正在处理一堆远程计算机,需要交换文件。使用 Copy-Item 命令时,需要指定特定的计算机。但是使用剪贴板时,不需要提前指定特定的计算机。我只需从本地计算机将文件复制到剪贴板中。每个读取剪贴板的远程计算机都将获取这些文件。在我的情况下,不总是清楚哪些远程计算机需要获取这些文件。 - Sheldon
1
你是如何与远程计算机进行工作的?如果您能提供更多上下文,那将会很有帮助,这样我们就可以找到比剪贴板更好的解决方案。使用 Set-Clipboard 只能复制本地路径。我不明白远程计算机应该如何访问您的本地剪贴板并使用这些对他们没有意义的本地路径。 - zett42
同意“zett42”所说的。你似乎是在说远程计算机正在访问你的主机剪贴板?他们是怎么做到的?除了安全问题之外,也就是说,如果远程用户可以随时访问您的剪贴板,而您却不知情,同时还有恶意代码存在于您的剪贴板上。好吧,我只是说说而已。我绝对不会相信这个。如果我是你的风险管理/安全团队,我们将对此进行非常长时间的讨论。为什么不直接将文件放在远程文件共享中,并从那里获取它们呢?您可以自动丢弃。 - postanote
1
通过 RDP,您可以选择在远程会话中使用某些资源,包括剪贴板等。分享剪贴板是一种相当普遍的做法,在我看来。您可以在远程会话中执行此操作,也可以在子系统中执行此操作。为什么不可能呢?我没有看到任何安全问题,因为我是唯一访问这些远程计算机的人。 但根据您的写作,我认为没有简单的方法可以使用 PowerShell 将文件粘贴到指定目录。所以感谢您的贡献。我将采用另一种方式并重新考虑整个事情。 - Sheldon
使用剪贴板的另一个原因是Citrix桌面。我的远程Citrix桌面不允许PowerShell远程操作,但它可以访问我的本地剪贴板。 - Eric Eskildsen
3个回答

1
您可以使用.NET的Clipboard类:
Add-Type -AssemblyName System.Windows.Forms

$files = [System.Collections.Specialized.StringCollection]::new()
$files.Add('YOUR_FILE_PATH_HERE')

[System.Windows.Forms.Clipboard]::SetFileDropList($files)

这将把YOUR_FILE_PATH_HERE复制到本地剪贴板。
例如,当您在本地终端中需要将文件复制到远程会话(例如RDP或Citrix)而无需使用PowerShell远程控制时,可以使用此功能,而不必在资源管理器中打开目录。
这有点麻烦,所以如果我经常使用它,我可能会将其放入一个名为Copy-FileToClipboard的函数中,并将其添加到我的PowerShell配置文件中。

1

这是我用来粘贴文件/目录的脚本:

$fileDrop = get-clipboard -Format FileDropList 
if($fileDrop -eq $null)
{
    write-host "No files on the clipboard"
    return
}

foreach($file in $fileDrop)
{
    if($file.Mode.StartsWith("d"))
    {
        $source = join-path $file.Directory $file.Name
        $e = "copy-item -Recurse $source $($file.Name)"
        $e
        Invoke-Expression $e
    }
    else
    {
        $file.Name
        $file | copy-item
    }
}


0
受本主题中其他评论的启发,但经过了重构,并支持移动和复制操作(移动是默认操作,而使用-c参数可实现复制)。该脚本将剪贴板中的文件和文件夹粘贴到当前目录中(我已将其放置在PATH目录中,并将其用作paste)。
$data = Get-Clipboard -Format FileDropList 

if ($data -ne $null)
{
    foreach ($file in $data)
    {
        if ($args[0] -eq "-c")
        {
            $action = "Copied:"
            Copy-Item -Recurse -LiteralPath $file
        }
        else
        {
            $action = "Moved:"
            Move-Item -LiteralPath $file
        }
        
        $action
        "- from: $(Join-Path $file.Directory $file.Name)"
        "- into: $(Join-Path "$(Get-Location)" $file.Name)"
    }
}

需要使用-LiteralPath参数来处理包含方括号的文件名。


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