Board logo

标题: [文件操作] bat获取多个文件拖放的路径 [打印本页]

作者: wskwfkbdn    时间: 2016-1-29 15:50     标题: bat获取多个文件拖放的路径

本帖最后由 wskwfkbdn 于 2016-1-29 16:48 编辑
发表于 2010-4-5 23:44
[未彻底解决]多个文件拖到cmd窗口后,如何获取每一文件的完整路径

打开帖子地址

看到这个帖子中说到拖放的文件路径中如果包含 “&” 或者 空格 等字符,难以正常的获取文件完整路径,我也尝试了很久,确实非常的麻烦,因为bat接收运行参数是%0~%9的,默认以空格符分割,如果文件路径存在&字符和空格符,那么%0~%9获取参数肯定是不完整的,只好用%*接收所有参数进行字符处理,以下代码不解释啦,高手懂了就懂了,菜鸟还是看注释吧。也请大神们多多指教。
  1. @echo OFF&SETLOCAL ENABLEDELAYEDEXPANSION
  2. TITLE 获取多个文件的完整路径 兼容特殊字符
  3. REM ABCDEFGHIJKLMNOPQRSTUVWXYZ
  4. REM %* 接收全部参数 目前仅最大支持25参数,也就是一次性接收25个文件的拖放处理。
  5. SET xiao=%*
  6. REM 取路径的驱动器号(C: D: E: ......)
  7. SET abc=%xiao:~0,2%
  8. ECHO ^%abc%|find ":" >nul && set jjdd=^%abc:~0,1%||set jjdd=^%abc:~1,2%
  9. REM 以“:”作为分割符 分割文本
  10. FOR /f "tokens=1-26 delims=:"  %%a IN ('echo %xiao%') DO (
  11.   SET abc=0
  12.   IF NOT "%%a"=="" CALL :HeHe "%jjdd%:%%b"
  13.   IF NOT "%%c"=="" CALL :HeHe "%jjdd%:%%c"
  14.   IF NOT "%%d"=="" CALL :HeHe "%jjdd%:%%d"
  15.   IF NOT "%%e"=="" CALL :HeHe "%jjdd%:%%e"
  16.   IF NOT "%%f"=="" CALL :HeHe "%jjdd%:%%f"
  17.   IF NOT "%%g"=="" CALL :HeHe "%jjdd%:%%g"
  18.   IF NOT "%%h"=="" CALL :HeHe "%jjdd%:%%h"
  19.   IF NOT "%%i"=="" CALL :HeHe "%jjdd%:%%i"
  20.   IF NOT "%%j"=="" CALL :HeHe "%jjdd%:%%j"
  21.   IF NOT "%%k"=="" CALL :HeHe "%jjdd%:%%k"
  22.   IF NOT "%%l"=="" CALL :HeHe "%jjdd%:%%l"
  23.   IF NOT "%%m"=="" CALL :HeHe "%jjdd%:%%m"
  24.   IF NOT "%%n"=="" CALL :HeHe "%jjdd%:%%n"
  25.   IF NOT "%%o"=="" CALL :HeHe "%jjdd%:%%o"
  26.   IF NOT "%%p"=="" CALL :HeHe "%jjdd%:%%p"
  27.   IF NOT "%%q"=="" CALL :HeHe "%jjdd%:%%q"
  28.   IF NOT "%%r"=="" CALL :HeHe "%jjdd%:%%r"
  29.   IF NOT "%%s"=="" CALL :HeHe "%jjdd%:%%s"
  30.   IF NOT "%%t"=="" CALL :HeHe "%jjdd%:%%t"
  31.   IF NOT "%%u"=="" CALL :HeHe "%jjdd%:%%u"
  32.   IF NOT "%%v"=="" CALL :HeHe "%jjdd%:%%v"
  33.   IF NOT "%%w"=="" CALL :HeHe "%jjdd%:%%w"
  34.   IF NOT "%%x"=="" CALL :HeHe "%jjdd%:%%x"
  35.   IF NOT "%%y"=="" CALL :HeHe "%jjdd%:%%y"
  36.   IF NOT "%%z"=="" CALL :HeHe "%jjdd%:%%z"
  37. )
  38. PAUSE&EXIT
  39. :HeHe
  40. REM 对已经分割好的文本进行最后的替换处理,删除多余字符。
  41. SET aa=%1
  42. SET /a abc+=1
  43. SET "aa=!aa: %jjdd%=!"
  44. SET "aa=!aa: "%jjdd%=!"
  45. SET "aa=!aa:""="!"
  46. ECHO %abc% !aa!
  47. GOTO :EOF
复制代码

作者: 回家路上    时间: 2016-1-29 17:20

用原帖的文件测试,并不好使
  1. cd.>"abc.txt"
  2. cd.>"abc xyz.txt"
  3. cd.>"abc^xyz.txt"
  4. cd.>"abc&xyz.txt"
  5. cd.>"abc & xyz.txt"
  6. cd.>"(abc)(xyz).txt"
  7. cd.>"(abc) (xyz).txt"
  8. cd.>"(abc)&(xyz).txt"
  9. cd.>"(abc) & (xyz).txt"
  10. cd.>"abc;xyz.txt"
  11. cd.>"abc,xyz.txt"
  12. cd.>"abc=xyz.txt"
复制代码

作者: wskwfkbdn    时间: 2016-1-29 18:36

本帖最后由 wskwfkbdn 于 2016-1-29 20:19 编辑

回复 2# 回家路上


    稍加处理下就好了,有部分可以兼容处理,但有些根本是不行的,来看下进程运行参数:

1) cmd /c ""C:\xx\xx\BAT获取多个文件路径.bat" C:\xx\xx\abc&xyz.txt"
2) cmd /c ""C:\xx\xx\BAT获取多个文件路径.bat" "C:\xx\xx\abc &xyz.txt""
3) cmd /c ""C:\xx\xx\BAT获取多个文件路径.bat" "C:\xx\x x\abc&xyz.txt""

1)文件拖放到 BAT获取多个文件路径.bat上面 是会引起命令错误的,导致cmd.exe直接退出,原因是完整路径被当成命令处理啦,cmd只对包含空格的路径添加双引号。
2、3)如果特殊字符的文件名或路径包含空格 ,拖放是会自动添加上双引号的。这样情况不会导致cmd.exe直接退出,接下来的字符处理就不是问题啦。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2