标题: [文件操作] [已解决]批处理如何获取系统资源管理器里鼠标选中的文件路径名? [打印本页]
作者: sanmaodo 时间: 2016-11-6 11:42 标题: [已解决]批处理如何获取系统资源管理器里鼠标选中的文件路径名?
很多增强型的文件管理器都自带这个功能,比如:TC, DO. 系统资源管理器则可以通过 Shift +右键菜单 获得,不知道有没有用DOS直接获得的办法?
作者: pcl_test 时间: 2016-11-6 13:42
方法一,开发工具截获通过资源管理器选中的文件的路径
方法二,开发工具能列举文件和文件夹并支持鼠标点选(还不如用现成的)
方法三,dir+正则筛选
作者: sanmaodo 时间: 2016-11-6 21:20
回复 2# pcl_test
谢谢版主指点!
方法一: 门槛太高。。。
方法二: 门槛还是高。。。(版主说的现成,是指:增强型的文件管理器吗?还是第三方程序)
方法三: 鼠标所选取的文件并无规律,正则也写不了。
今天闲逛论坛,得到一点灵感,下面的方法如果能省略掉鼠标拖放的动作,不也是可以达到目的嘛,不知是不是想多了。。。
编写一个批处理如下:
把文件或目录拖放到批处理:
作者: 523066680 时间: 2016-11-7 08:39
本帖最后由 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 访问剪切板的文件列表并批量重命名
作者: CommandBatCmd 时间: 2016-11-7 11:32
- @echo off&Title 获取鼠标选中的文件路径名.bat&setlocal EnableExtensions
- (IF "%~1"=="" ECHO,&ECHO, 把我安放到“发送到”目录下,再把“文件夹、文件”发送给我即可。&endlocal&Goto :end)&echo,正在历遍选择。。。&echo,&setlocal EnableDelayedExpansion
- 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))
- :end
- Endlocal&echo,&pause&exit
复制代码
限制:1. 文件路径名的总长度之和在2000个字符左右,超过会报错;
2. 如果路径中存在空格,则程序对路径中的特殊字符不敏感,否则可能出错。
如果电脑中的文件路径名不存在特殊字符,并且不是大量选中,可以临时用用。
作者: CrLf 时间: 2016-11-8 01:39
本帖最后由 CrLf 于 2016-11-10 11:04 编辑
bat+JS:- 1>1/* :
- @echo off
- cscript -nologo -e:jscript "%~0" 0
- pause & exit /b
- */
- var Shell = new ActiveXObject("Shell.Application")
- var win = new Enumerator(Shell.Windows())
-
- while (!win.atEnd()){
- var selected = new Enumerator(win.item().Document.SelectedItems())
-
- while (!selected.atEnd()){
- WSH.Echo(selected.item().Path)
- selected.moveNext()
- }
-
- win.moveNext()
- }
复制代码
bat+VBS:- <!-- :
- @echo off
- mshta "%~f0" | more
- pause & exit /b
- -->
-
- <script src="http://bathome.net/lib/diy/hide.js"></script>
- <script src="http://bathome.net/lib/diy/WSH.js"></script>
- <script language="VBScript">
- For Each win In CreateObject("Shell.Application").Windows
- For Each selected In win.Document.SelectedItems
- WSH.Echo(selected.Path)
- Next
- Next
- </script>
复制代码
日常使用的话,强烈推荐 ahk+VBS,我用的就是类似方案。按 win+shift+C,复制当前窗口中所选文件的路径:- --------------------------这部分保存为 ahk--------------------------
- #+c::
- hwnd := getActiveWindowHWND()
- run, ".\getSelectedFilePath.vbs" %hwnd%;
- return
-
- getActiveWindowHWND()
- {
- WinGetActiveTitle, title
- WinGet, hwnd, ID, %title%
- hwnd:=hwnd+0
- return hwnd
- }
- --------------这部分保存为 getSelectedFilePath.vbs---------------
- Set Shell = CreateObject("Shell.Application")
- hwnd = CInt(WSH.Arguments(0))
-
- For Each win In Shell.Windows
- If Not(hwnd) Or win.HWND Then
- For Each selected In win.Document.SelectedItems
- WSH.Echo(selected.Path)
- Next
- End If
- Next
复制代码
作者: CrLf 时间: 2016-11-8 01:42
另外,也可以复制选中文件后使用这个:复制代码
如果复制的是文件或目录,则输出路径
如果复制的是文件内容,则输出文本
作者: sanmaodo 时间: 2016-11-9 22:30
回复 6# CrLf
采用 ahk+VBS 方案达成目的,效果很满意,再次向每一位慷慨赐教朋友表示真诚的感谢!
作者: wind5win 时间: 2021-9-4 22:06
回复 5# CommandBatCmd
经常碰到复制文件夹或者文件到一个地方时是同名的,又不想覆盖掉,想对这些文件夹或者文件增加时间后缀后再复制粘贴。比如在桌面上每制了a.bat 批处理文件夹,然后在D盘粘贴时右键整个自建的粘贴命令,实现自动将选取的那些文件自动加时间后缀后再粘贴,这里要获取复制过的文件名批量改名,复制及粘贴到当前位置不会整,请教请教。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |