找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 36179|回复: 9

[问题求助] Powershell能否将文件列表写入剪切板

[复制链接]
发表于 2014-7-5 20:24:40 | 显示全部楼层 |阅读模式
本帖最后由 523066680 于 2014-7-5 20:43 编辑

想实现一个功能:在某个文件夹鼠标右键粘贴来自于不同目录的Files
这个操作在Explorer中操作不成功(或者说是不同的目录复制粘贴要分批操作),考虑用脚本将文件列表一次写入剪切板,
所以咨询下,Powershell可以向剪切板写入文件列表吗?

用伪代码表达我的问题就是,能不能这样:
clipboard.setAs(
       ("C:\movie.mkv",
        "E:\multi.avi",
        "D:\demo.flac"),  "FILE"
);
发表于 2014-7-6 00:09:11 | 显示全部楼层
dir | clip.exe
发表于 2014-7-6 00:55:13 | 显示全部楼层
回复 2# victorwoo


    dir不能满足“自于不同目录的Files”这个要求吧
发表于 2014-7-6 04:11:44 | 显示全部楼层
本帖最后由 CrLf 于 2014-7-6 04:14 编辑

如果只是文件名那好办,不用 clip.exe 的办法是:
(以 powershell -sta 启动后)
  1. Add-Type -Assembly PresentationCore
  2. $a='a.txt','b.txt','c.txt'
  3. [Windows.Clipboard]::SetText($a -join "`n")
复制代码
复制文件可以这样:
  1. $filelist = 'c:\a.txt','d:\b.txt'
  2. $col = New-Object Collections.Specialized.StringCollection
  3. foreach($file in $filelist){$col.add($file)}
  4. [Windows.Clipboard]::setfiledroplist($col)
复制代码
----------------------------------------------------------------
不过这种事其实用 ahk 更合适,复制文件名:
  1. Clipboard:= "c:\a.txt`r`nd:\b.txt"
复制代码
复制文件:
  1. FileAppend, %ClipboardAll%, c:\a.txt
  2. FileAppend, %ClipboardAll%, d:\b.txt
复制代码
 楼主| 发表于 2014-7-11 10:42:43 | 显示全部楼层
回复 4# CrLf


    ahk这么方便论坛不设一个AHK的版块?
 楼主| 发表于 2014-7-11 11:35:39 | 显示全部楼层
本帖最后由 523066680 于 2014-7-11 14:29 编辑

回复 4# CrLf


    由衷感谢CRLF童鞋,
FileAppend, %ClipboardAll%, C:\Find.Me.Guilty.2006.720p.BluRay.x264-WiKi.mkv
FileAppend, %ClipboardAll%, C:\Survival.Code.aka.Borealis.2013.SUB.720p.WEB-DL.x264.AC3-SmY.mkv

怪我没去看帮助文件,执行这两句话后我的电影变成1KB了…… T_T

这东西的作用
Writes text to the end of a file (first creating the file, if necessary).


ahk的那些功能好像也就和nircmd差不多?
发表于 2014-7-11 15:53:36 | 显示全部楼层
回复 6# 523066680


    噗...我看手册复制偏了...
忽然发现 ahk 好像没法直接复制文件,请教了一下 tmplinshi 大师,得到了一大坨代码:
  1. #NoEnv
  2. #SingleInstance Force
  3. SetWorkingDir %A_ScriptDir%
  4. SetBatchLines -1

  5. fileList := "
  6. (LTrim
  7.         js.txt
  8.         e:\我的文档\桌面\vcode\18.jpg
  9. )"
  10. FileToClipboard(fileList)

  11. FileToClipboard(PathToCopy, Method="copy")
  12. {
  13.         ; 展开为完整路径
  14.                 Loop, Parse, PathToCopy, `n, `r
  15.                         Loop, %A_LoopField%
  16.                                 PathToCopy_Full .= "`n" A_LoopFileLongPath
  17.                 PathToCopy := Trim(PathToCopy_Full, "`n")

  18.         FileCount:=0
  19.         PathLength:=0

  20.         ; Count files and total string length
  21.         Loop,Parse,PathToCopy,`n,`r
  22.         {
  23.                 FileCount++
  24.                 PathLength += StrLen(A_LoopField)
  25.         }

  26.         pid:=DllCall("GetCurrentProcessId","uint")
  27.         hwnd:=WinExist("ahk_pid " . pid)
  28.         ; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40)
  29.         hPath := DllCall("GlobalAlloc","uint",0x42,"uint",20 + (PathLength + FileCount + 1) * 2,"UPtr")
  30.         pPath := DllCall("GlobalLock","UPtr",hPath)
  31.         NumPut(20,pPath+0),pPath += 16 ; DROPFILES.pFiles = offset of file list
  32.         NumPut(1,pPath+0),pPath += 4 ; fWide = 0 -->ANSI,fWide = 1 -->Unicode
  33.         Offset:=0
  34.         Loop,Parse,PathToCopy,`n,`r ; Rows are delimited by linefeeds (`r`n).
  35.                 offset += StrPut(A_LoopField,pPath+offset,StrLen(A_LoopField)+1,"UTF-16") * 2

  36.         DllCall("GlobalUnlock","UPtr",hPath)
  37.         DllCall("OpenClipboard","UPtr",hwnd)
  38.         DllCall("EmptyClipboard")
  39.         DllCall("SetClipboardData","uint",0xF,"UPtr",hPath) ; 0xF = CF_HDROP

  40.         ; Write Preferred DropEffect structure to clipboard to switch between copy/cut operations
  41.         ; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40)
  42.         mem := DllCall("GlobalAlloc","uint",0x42,"uint",4,"UPtr")
  43.         str := DllCall("GlobalLock","UPtr",mem)

  44.         if (Method="copy")
  45.                 DllCall("RtlFillMemory","UPtr",str,"uint",1,"UChar",0x05)
  46.         else if (Method="cut")
  47.                 DllCall("RtlFillMemory","UPtr",str,"uint",1,"UChar",0x02)
  48.         else
  49.         {
  50.                 DllCall("CloseClipboard")
  51.                 return
  52.         }

  53.         DllCall("GlobalUnlock","UPtr",mem)

  54.         cfFormat := DllCall("RegisterClipboardFormat","Str","Preferred DropEffect")
  55.         DllCall("SetClipboardData","uint",cfFormat,"UPtr",mem)
  56.         DllCall("CloseClipboard")
  57.         return
  58. }
复制代码
发表于 2014-7-11 15:59:24 | 显示全部楼层
回复 6# 523066680


    ahk 比 nircmd 强大太多了好吧
 楼主| 发表于 2014-7-11 16:34:17 | 显示全部楼层
回复 7# CrLf


    屌炸天
发表于 2014-8-11 10:57:40 | 显示全部楼层
ahk确实不错的。
呵呵,能够得到 tmplinshi大神的指点,不错啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 01:10 , Processed in 0.016371 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表