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

[文件操作] [已解决]批处理如何获取系统资源管理器里鼠标选中的文件路径名?

[复制链接]
发表于 2016-11-6 11:42:32 | 显示全部楼层 |阅读模式
很多增强型的文件管理器都自带这个功能,比如:TC, DO. 系统资源管理器则可以通过 Shift +右键菜单 获得,不知道有没有用DOS直接获得的办法?

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2016-11-6 13:42:19 | 显示全部楼层
方法一,开发工具截获通过资源管理器选中的文件的路径
方法二,开发工具能列举文件和文件夹并支持鼠标点选(还不如用现成的)
方法三,dir+正则筛选
 楼主| 发表于 2016-11-6 21:20:19 | 显示全部楼层
回复 2# pcl_test
谢谢版主指点!

方法一:   门槛太高。。。
方法二:   门槛还是高。。。(版主说的现成,是指:增强型的文件管理器吗?还是第三方程序)
方法三:   鼠标所选取的文件并无规律,正则也写不了。

今天闲逛论坛,得到一点灵感,下面的方法如果能省略掉鼠标拖放的动作,不也是可以达到目的嘛,不知是不是想多了。。。

编写一个批处理如下:

把文件或目录拖放到批处理:
发表于 2016-11-7 08:39:07 | 显示全部楼层
本帖最后由 523066680 于 2016-11-7 10:52 编辑

你可以在鼠标选中文件后加一个动作,按ctrl+c 或者 鼠标右键-复制,然后用程序访问剪切板。

建议找一下第三方工具或者使用其他编程语言

访问剪切板的文件列表(Perl):

  • use Win32::Clipboard;
  • use IO::Handle;
  • use Time::HiRes 'sleep';
  • STDOUT->autoflush(1);
  • print "Select files, then copy to clipboard\n";
  • my $clip = Win32::Clipboard;
  • $clip->Empty();
  • my @files;
  • while (1)
  • {
  •     sleep 0.3;
  •     print ".";
  •     @files = $clip->GetFiles();
  •     if ( $files[0] ne "" )
  •     {
  •         print join "\n", @files;
  •         $clip->Empty();
  •         last;
  •     }
  • }


参考:[Perl]rnfiles.pl 访问剪切板的文件列表并批量重命名

评分

参与人数 1技术 +1 收起 理由
sanmaodo + 1 感谢版主指点

查看全部评分

发表于 2016-11-7 11:32:25 | 显示全部楼层
  1. @echo off&Title 获取鼠标选中的文件路径名.bat&setlocal EnableExtensions
  2.     (IF "%~1"=="" ECHO,&ECHO,    把我安放到“发送到”目录下,再把“文件夹、文件”发送给我即可。&endlocal&Goto :end)&echo,正在历遍选择。。。&echo,&setlocal EnableDelayedExpansion
  3.     FOR /L %%I IN (1,1,500) DO (CALL SET "A=%%~1"&&IF NOT "!A!"=="" (set /p"=!A!"<nul&echo,&SHIFT /1) else (endlocal&GOTO :end))
  4.     :end
  5. Endlocal&echo,&pause&exit
复制代码
限制:1. 文件路径名的总长度之和在2000个字符左右,超过会报错;

      2. 如果路径中存在空格,则程序对路径中的特殊字符不敏感,否则可能出错。

如果电脑中的文件路径名不存在特殊字符,并且不是大量选中,可以临时用用。

评分

参与人数 1技术 +1 收起 理由
sanmaodo + 1 感谢! 很强大。

查看全部评分

发表于 2016-11-8 01:39:14 | 显示全部楼层
本帖最后由 CrLf 于 2016-11-10 11:04 编辑

bat+JS:
  1. 1>1/* :
  2. @echo off
  3. cscript -nologo -e:jscript "%~0" 0
  4. pause & exit /b
  5. */
  6. var Shell = new ActiveXObject("Shell.Application")
  7. var win = new Enumerator(Shell.Windows())

  8. while (!win.atEnd()){
  9.         var selected = new Enumerator(win.item().Document.SelectedItems())

  10.         while (!selected.atEnd()){
  11.                 WSH.Echo(selected.item().Path)
  12.                 selected.moveNext()
  13.         }

  14.         win.moveNext()
  15. }
复制代码
bat+VBS:
  1. <!-- :
  2. @echo off
  3. mshta "%~f0" | more
  4. pause & exit /b
  5. -->

  6. <script src="http://bathome.net/lib/diy/hide.js"></script>
  7. <script src="http://bathome.net/lib/diy/WSH.js"></script>
  8. <script language="VBScript">
  9. For Each win In CreateObject("Shell.Application").Windows
  10.         For Each selected In win.Document.SelectedItems
  11.                 WSH.Echo(selected.Path)
  12.         Next
  13. Next
  14. </script>
复制代码
日常使用的话,强烈推荐 ahk+VBS,我用的就是类似方案。按 win+shift+C,复制当前窗口中所选文件的路径:
  1. --------------------------这部分保存为 ahk--------------------------
  2. #+c::
  3. hwnd := getActiveWindowHWND()
  4. run, ".\getSelectedFilePath.vbs" %hwnd%;
  5. return

  6. getActiveWindowHWND()
  7. {
  8.    WinGetActiveTitle, title
  9.    WinGet, hwnd, ID, %title%
  10.    hwnd:=hwnd+0
  11.    return hwnd
  12. }
  13. --------------这部分保存为 getSelectedFilePath.vbs---------------
  14. Set Shell = CreateObject("Shell.Application")
  15. hwnd = CInt(WSH.Arguments(0))

  16. For Each win In Shell.Windows
  17.         If Not(hwnd) Or win.HWND Then
  18.                 For Each selected In win.Document.SelectedItems
  19.                         WSH.Echo(selected.Path)
  20.                 Next
  21.         End If
  22. Next
复制代码

评分

参与人数 2技术 +2 收起 理由
sanmaodo + 1 受益匪浅,严重感谢!!!!
DiamondbacK + 1 1

查看全部评分

发表于 2016-11-8 01:42:19 | 显示全部楼层
另外,也可以复制选中文件后使用这个:
  1. xclip /get
复制代码
如果复制的是文件或目录,则输出路径
如果复制的是文件内容,则输出文本

评分

参与人数 1技术 +1 收起 理由
sanmaodo + 1 感谢指点!

查看全部评分

 楼主| 发表于 2016-11-9 22:30:45 | 显示全部楼层
回复 6# CrLf
采用 ahk+VBS 方案达成目的,效果很满意,再次向每一位慷慨赐教朋友表示真诚的感谢!
发表于 2021-9-4 22:06:49 | 显示全部楼层
回复 5# CommandBatCmd


    经常碰到复制文件夹或者文件到一个地方时是同名的,又不想覆盖掉,想对这些文件夹或者文件增加时间后缀后再复制粘贴。比如在桌面上每制了a.bat 批处理文件夹,然后在D盘粘贴时右键整个自建的粘贴命令,实现自动将选取的那些文件自动加时间后缀后再粘贴,这里要获取复制过的文件名批量改名,复制及粘贴到当前位置不会整,请教请教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-21 00:40 , Processed in 0.036204 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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