找回密码
 加入
搜索
查看: 21885|回复: 51

[系统综合] 如何获取在文件夹窗口中选择的多个文件的文件名

 火... [复制链接]
发表于 2010-8-5 23:29:01 | 显示全部楼层 |阅读模式
本帖最后由 afan 于 2010-8-6 15:20 编辑

在文件夹窗口(或资源管理器)中选择多个文件或文件夹,如何获取这些文件名?

如果用Command Line Parameters貌似只能获取一个文件名$CmdLineRaw,无法取得全部。
想得到类似 “WinRAR” 或 “重命名软件” 或 “删除(回收站)”选择多个文件后在右键菜单操作,返回文件名给它操作的目的。

不考虑复制到剪贴板再读取或者拖曳的形式。

其中可能有两个问题需要解决:
1,如何取得选择多个文件的文件名
2,如何在右键菜单中仅调用一次(不然会同时响应N个相同的获取上面文件名的命令;莫非需做个dll调用?)


这个问题的解决实用性是很大的~ 谢谢各位的关注~!

评分

参与人数 1金钱 +20 收起 理由
lynfr8 + 20 好问题!

查看全部评分

 楼主| 发表于 2010-8-6 13:48:15 | 显示全部楼层
如果知道这个文件类型是怎么样关联的。应该就好办了吧?
xsjtxy 发表于 2010-8-6 13:41



    呵呵,这个我也试过,貌似跟当前文件夹的查看方式有关,很多情况下是获取不到的。用"ViewChange", "视图",似乎也无效;其次,通过文件类型项目再去获取后缀名似乎比较繁琐…
发表于 2010-8-6 12:20:08 | 显示全部楼层

是说不会那么简单的吧。
发表于 2010-8-6 10:26:59 | 显示全部楼层
不懂帮顶。
另外请教如何Command命令获取一个文件名?
发表于 2010-8-6 10:34:28 | 显示全部楼层
昨晚这问题刚一出来、我就瞅见了,想了一晚上未果!
发表于 2010-8-6 12:08:58 | 显示全部楼层
Send("#e")
WinWait("我的电脑","我的电脑")
ControlFocus("我的电脑", "我的电脑", "SysListView321")
Send("^a")
$a = ControlListView("我的电脑", "我的电脑", "SysListView321", "GetSelected",1)
$b = StringSplit($a, "|")
for $i = 1 to $b[0]
$c = ControlListView("我的电脑", "我的电脑", "SysListView321", "GetText", $b[$i])
msgbox(0,"选中的项目",$c)
next

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-8-6 12:12:08 | 显示全部楼层
xsjtxy 发表于 2010-8-6 12:08



    呵呵,利用ControlListView的方法我早就试过了,无法获取完整的文件名(带后缀名),除非系统本身就是显示后缀的…
 楼主| 发表于 2010-8-6 12:21:49 | 显示全部楼层
不懂帮顶。
另外请教如何Command命令获取一个文件名?
3mile 发表于 2010-8-6 10:26


不好意思让你误解了,其实是Command Line Parameters,就是通过$CmdLine来获取。
在注册表中写入相关键值,利用 %1 的参数来返回文件完整路径。
 楼主| 发表于 2010-8-6 12:23:17 | 显示全部楼层
昨晚这问题刚一出来、我就瞅见了,想了一晚上未果!
水木子 发表于 2010-8-6 10:34



    我知道你瞅见了,呵呵~
再次谢谢各位老友的关注~~
发表于 2010-8-6 12:53:48 | 显示全部楼层
4楼的方法我也想过,不过!貌似Windows7里完全行不通。
发表于 2010-8-6 12:58:17 | 显示全部楼层
回复 9# 水木子


    封装类,看不到内容了是吧?
发表于 2010-8-6 13:00:13 | 显示全部楼层
回复 10# thesnow
是啊!返回全是 0
发表于 2010-8-6 13:41:07 | 显示全部楼层
如果知道这个文件类型是怎么样关联的。应该就好办了吧?
$a = ControlListView("下载目录", "", "SysListView321", "GetSelected",1)
$b = StringSplit($a, "|")
for $i = 1 to $b[0]
$c = ControlListView("下载目录", "", "SysListView321", "GetText", $b[$i])
$d = ControlListView("下载目录", "", "SysListView321", "GetText", $b[$i],2)
msgbox(0,"选中的文件:",$c&@CR&"文件类型:"&$d)
next

评分

参与人数 1威望 +2 收起 理由
afan + 2

查看全部评分

发表于 2010-8-6 22:44:31 | 显示全部楼层
其中可能有两个问题需要解决:
1,如何取得选择多个文件的文件名
2,如何在右键菜单中仅调用一次(不然会同时响应N个相同的获取上面文件名的命令;莫非需做个dll调用?)

问题1解决方法:可以通过将当前路径所有文件和文件夹读入数组,再获取已经选择的文件名对比;但是桌面的文件路径如何获取?这个需要另外判断了。
问题2暂时解决方法:检测是否相同进程,是则杀死进程,但是缺点就是多选文件获取路径时候鼠标状态会依然反映为忙碌,并且任务栏弹出和选取文件数相同的图标,尚需完美解决。
#include <File.au3>
#include <Array.au3>
;#NoTrayIcon
$process = processlist(@ScriptName)
for $i = 1 to $process[0][0]
if $process[$i][1] <> @AutoItPID then 
processclose($process[$i][1])
endif
next
$AllSelectedName = ''
$Selecte = StringSplit(ControlListView(WinGetTitle("[active]"), "", "SysListView321", "GetSelected", 1), "|")
$Filenames = _FileListToArray(WinGetTitle("[active]"), '*', 0)
For $i = 1 To $Selecte[0]
 $SelectedName = ControlListView(WinGetTitle("[active]"), "", "SysListView321", "GetText", $Selecte[$i])
 If $Filenames <> 0 Then
  For $n = 1 To $Filenames[0]
   $path = StringReplace(WinGetTitle("[active]")& $Filenames[$n],'\\','\')
   If $Filenames[$n] = $SelectedName Or StringRegExpReplace($Filenames[$n], '(\..+)', '') = $SelectedName And DirGetSize($path ) = -1 Then
    $AllSelectedName &= '文件:' & $path  & @CRLF
   ElseIf $Filenames[$n] = $SelectedName Or StringRegExpReplace($Filenames[$n], '(\..+)', '') = $SelectedName And DirGetSize($path ) <> -1 Then
    $AllSelectedName &= '文件夹:' & $path  & @CRLF
   EndIf
  Next
 EndIf
Next
ClipPut(StringRegExpReplace($AllSelectedName, '文件夹:|文件:', ''))
;TrayTip("路径已复制到剪切板 By lynfr8", $AllSelectedName, 5)
ToolTip($AllSelectedName, 0, 0, "路径已复制到剪切板 By lynfr8")
Sleep(1000)

上面代码编译为exe后放在c盘根目录,并将附件注册表导入。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

发表于 2010-8-6 22:52:14 | 显示全部楼层
想了很多方法,最后也只有剪贴版好像较好。
召唤P大拦截系统消息搞定吧。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-8 23:32 , Processed in 0.090201 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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