[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

很多增强型的文件管理器都自带这个功能,比如:TC, DO. 系统资源管理器则可以通过 Shift +右键菜单 获得,不知道有没有用DOS直接获得的办法?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

方法一,开发工具截获通过资源管理器选中的文件的路径
方法二,开发工具能列举文件和文件夹并支持鼠标点选(还不如用现成的)
方法三,dir+正则筛选

TOP

回复 2# pcl_test
谢谢版主指点!

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

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

编写一个批处理如下:

把文件或目录拖放到批处理:

TOP

本帖最后由 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

评分人数

TOP

  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

评分人数

TOP

本帖最后由 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

评分人数

TOP

另外,也可以复制选中文件后使用这个:
  1. xclip /get
复制代码
如果复制的是文件或目录,则输出路径
如果复制的是文件内容,则输出文本
1

评分人数

TOP

回复 6# CrLf
采用 ahk+VBS 方案达成目的,效果很满意,再次向每一位慷慨赐教朋友表示真诚的感谢!

TOP

回复 5# CommandBatCmd


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

TOP

返回列表