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

[未彻底解决]多个文件拖到cmd窗口后,如何获取每一文件的完整路径

  cmd窗口有一个特点:支持把文件拖曳到cmd窗口中来处理。

  编个十分简单的脚本来演示一下:
  1. @echo off
  2. echo %1
  3. pause
复制代码
  一般的情形是这样的:

  1、当文件的完整路径中带有空格的时候,cmd窗口将自动为文件的完整路径首尾添加一对引号。例如,把 d:\abc xyz 文件夹下的 test.txt 文件拖曳到以上代码所在的脚本文件上之后,将在屏幕上显示: "d:\abc xyz\test.txt"
  2、当文件的完整路径中没有空格的时候,cmd窗口将不会为文件的完整路径添加引号对。例如:把 d:\abcxyz 文件夹下的 test.txt 文件拖曳到以上代码所在的脚本文件上之后,将在屏幕上显示: d:\abcxyz\test.txt。请注意,这个时候,文件路径里没有引号对。

  当然,这只是一般情形。还有一种特殊情形:当文件的完整路径中有&但是不带空格的时候,以上代码将捕获不到正确的路径。比如:把 d:\abcxyz 文件夹下的 test1&test2.txt 文件拖曳到以上代码所在的脚本文件上之后,屏幕上显示的不是 d:\abcxyz\test1&test2.txt,而是显示: d:\abcxyz\test1,也就是说,&后的字符串直接被丢弃掉了。这可能是cmd窗口在捕获or传递参数时的一个bug。

  假设 d:\test 目录下有如下文件,现在把它们同时拖曳到脚本文件上来执行,需要获得每一个文件的完整路径,请问如何编写代码?
  1. abc.txt
  2. abc xyz.txt
  3. abc^xyz.txt
  4. abc&xyz.txt
  5. abc & xyz.txt
  6. (abc)(xyz).txt
  7. (abc) (xyz).txt
  8. (abc)&(xyz).txt
  9. (abc) & (xyz).txt
  10. abc;xyz.txt
  11. abc,xyz.txt
  12. abc=xyz.txt
复制代码
  想到这个问题,是源于这个帖子的讨论: 如何用批处理批量移动文件或文件夹?(http://bbs.bathome.net/thread-7504-1-1.html

  提示:一般情况下,可以用如下代码显示多个文件的完整路径:
  1. @echo off
  2. echo %*
  3. pause
复制代码
=====================================================
qzwqzw 在7楼给出了解释:
用批处理的办法基本无解

这个问题源于Explorer的拖放扩展程序shell32.dll
注册表路径位于HKEY_CLASSES_ROOT\CLSID\{86C86720-42A0-1069-A2E8-08002B30309D}
因为它没有将“&"视为转义符号
所以不会用引号对将其扩起取消转义

所以对于这个问题无非以下几个方案:
1、修改拖放扩展程序shell32.dll,让它可以处理"&"的情况;
2、新建拖放扩展程序,专门处理cmd之类程序的路径过滤;
3、在处理前告知用户使用"&"的情况可能出错,交由用户处理发生的异常;

  既然这样,那么,用批处理来做的话,只好不去兼容带&但不同时带空格的完整路径这一情况了(路径中带有^符号也不行,头疼ing)。演示代码如下:
  1. @echo off
  2. set str=%*
  3. set "str=%str:"=%"
  4. set "str= %str%"
  5. call set "str=%%str: %~d1=" "%~d1%%"
  6. for %%i in ("%str%") do echo %%i
  7. pause
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

是%1么?
我记得好像是%0

TOP

能提取这样的:abc & xyz.txt,却不能提取abc&xyz.txt,郁闷....

题是好题....

TOP

额,有点难度啊,思考中。。。

TOP

回复 2楼 的帖子

相当明显,你记错了。

TOP

既然是拖到窗口...那么就是系统自动完成的...
要在这个阶段用BAT脚本插手是没办法的..
只能在接受到1%以后,再做路径判断..有问题自动补偿完整

TOP

用批处理的办法基本无解

这个问题源于Explorer的拖放扩展程序shell32.dll
注册表路径位于HKEY_CLASSES_ROOT\CLSID\{86C86720-42A0-1069-A2E8-08002B30309D}
因为它没有将“&"视为转义符号
所以不会用引号对将其扩起取消转义

所以对于这个问题无非以下几个方案:
1、修改拖放扩展程序shell32.dll,让它可以处理"&"的情况;
2、新建拖放扩展程序,专门处理cmd之类程序的路径过滤;
3、在处理前告知用户使用"&"的情况可能出错,交由用户处理发生的异常;
4

评分人数

    • namejm: 一针见血的分析,很有深度,佩服。技术 + 1
    • FOR: 赞!技术 + 1
    • vsbat: 高手 佩服-技术 + 1
    • yangfengoo: haoPB + 5 技术 + 1

TOP

¥¥¥重大发现¥¥¥!!!!!!

不带空格的目录中含有&号时,&会把后面字符串的作为一个新的项目去执行!
前面没了%0,只是字符串单独作为一个新命令行的在裸奔!!!

如下面的目录:

“新建文件夹&notepad&notepad&notepad”

当拖曳到一楼的示范批处理,在按了任意键之后,会连续打开3次记事本!!!!

神吧!!!目录也可以作为命令去运行程序了

TOP

回复 8楼 的帖子

作用实在有限,恶作剧或者掩饰命令还可以

TOP

应该算是大家都知道的老经验了吧,对于%x参数引用较保险的做法是"%~x"
怎么又重新讨论了呢?
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

不是那个意思了,其实这个问题是不可能解决的,因为有&在路径中后,系统把成多个任务去看了,
像这个:
“...\新建文件夹&notepad&notepad&notepad”
把它拖到:abc.bat后
其实在cmd窗口执行了四次任务了:
1,   abc.bat ...\新建文件夹
2,  notepad
3,  notepad
4,  notepad

如此一来,又怎么可能让abc.bat得到完整的路径参数呢?系统根本就没有打算给它。

TOP

  1. @echo off
  2. :a
  3. if not "%~1"=="" (echo "%~1" &shift /1 &goto :a)
  4. pause
复制代码
没看出来……


啊我现在才知道可以多个文件同时拖放并获取各个文件名,OUT了……
  !!!!
-O_o - 楼上本顿的技术飚到30了呵
_[  ]__

[ 本帖最后由 523066680 于 2010-4-9 22:38 编辑 ]

TOP

原帖由 zqz0012005 于 2010-4-9 21:09 发表
应该算是大家都知道的老经验了吧,对于%x参数引用较保险的做法是"%~x"
怎么又重新讨论了呢?

在 D 盘根目录新建一个文本文档,命名为 "R&B.txt" ,也就是创建一个文本文档 “D:\R&B.txt” ,
现在讨论的问题是把它拖到一个内容为

@echo off
echo %*
pause


的批处理文件上,怎样能使批处理能显示 D:\R&B.txt

TOP

@echo off
echo %*
pause
中用%*接收全部参数都没有得到abc&xyz.txt,应该是不行的
不过,把要此批处理显示路径的所有文件放到一个文件夹(如:d:\temp\)下,再dir d:\temp\*.txt /b
就得到了所要的路径

TOP

发觉大家,都有点太为难 set/p 命令了
  

           哈哈, 不过 也只有这样才能长知识长见识○( ̄﹏ ̄)○
    ╭╩═╮
╭╯G O ╠ 雁过留声
╰⊙═⊙╯

TOP

返回列表