cmd窗口有一个特点:支持把文件拖曳到cmd窗口中来处理。
编个十分简单的脚本来演示一下:复制代码 一般的情形是这样的:
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 目录下有如下文件,现在把它们同时拖曳到脚本文件上来执行,需要获得每一个文件的完整路径,请问如何编写代码?- abc.txt
- abc xyz.txt
- abc^xyz.txt
- abc&xyz.txt
- abc & xyz.txt
- (abc)(xyz).txt
- (abc) (xyz).txt
- (abc)&(xyz).txt
- (abc) & (xyz).txt
- abc;xyz.txt
- abc,xyz.txt
- abc=xyz.txt
复制代码 想到这个问题,是源于这个帖子的讨论: 如何用批处理批量移动文件或文件夹?(http://bbs.bathome.net/thread-7504-1-1.html)
提示:一般情况下,可以用如下代码显示多个文件的完整路径:复制代码 =====================================================
qzwqzw 在7楼给出了解释:
用批处理的办法基本无解
这个问题源于Explorer的拖放扩展程序shell32.dll
注册表路径位于HKEY_CLASSES_ROOT\CLSID\{86C86720-42A0-1069-A2E8-08002B30309D}
因为它没有将“&"视为转义符号
所以不会用引号对将其扩起取消转义
所以对于这个问题无非以下几个方案:
1、修改拖放扩展程序shell32.dll,让它可以处理"&"的情况;
2、新建拖放扩展程序,专门处理cmd之类程序的路径过滤;
3、在处理前告知用户使用"&"的情况可能出错,交由用户处理发生的异常;
既然这样,那么,用批处理来做的话,只好不去兼容带&但不同时带空格的完整路径这一情况了(路径中带有^符号也不行,头疼ing)。演示代码如下:- @echo off
- set str=%*
- set "str=%str:"=%"
- set "str= %str%"
- call set "str=%%str: %~d1=" "%~d1%%"
- for %%i in ("%str%") do echo %%i
- pause
复制代码
|