[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
经过一个下午的努力,终于有了结果,效率不是很高,但还是基本能够实现目标。第一次来挑战区,请多多指教。
  1. echo.>abc.txt
  2. echo.>"abc xyz.txt"
  3. echo.>"abc^xyz.txt"
  4. echo.>"abc&xyz.txt"
  5. echo.>"abc & xyz.txt"
  6. echo.>"(abc)(xyz).txt"
  7. echo.>"(abc) (xyz).txt"
  8. echo.>"(abc)&(xyz).txt"
  9. echo.>"(abc) & (xyz).txt"
  10. echo.>"abc;xyz.txt"
  11. echo.>"abc,xyz.txt"
  12. echo.>"abc=xyz.txt"
复制代码
可以同时拖拉多个文件到批处理中,最后获取这几个文件的完全合格文件名。
文件名含有空格的也可以实现。
但文件名中含有(.)与(&)的,后缀名非三位(如.db、html)的无法读取——需要重新设置。
不处理文件夹。

已经支持的后缀名有:txt;doc;exe;rar;mp3;jpg;wma;bat,其它格式需补充。
可能与 “echo %*”有关,重定向时自动放到“%USERPROFILE% ”中去了,只好用 “>>%~dp0”。

由于用了两对重复的FOR,特别是设置“hzm”的FOR,导致速度下降。
应该也支持从单个文本内容中提取路径名。方法是将“~dp0_2tyxs.txt”改为该文本名称。
其它方面有待完善。

  1. @echo off&setlocal enabledelayedexpansion
  2. echo %*>>"%~dp0_test.txt"
  3. echo.>"%~dp0_test2.txt"
  4. echo.>"%~dp0_results.txt"
  5. for /f "usebackq tokens=*" %%i in ("%~dp0_test.txt") do (
  6. set var=%%i
  7. for /l %%a in (0,1,1000) do (
  8. set /a ddl=%%a-1
  9. set str2=!var:~%%a,2!
  10. if "!str2!"==":\" call echo %%var:~!ddl!,1%%!var:~%%a,1000!>>"%~dp0_test1.txt"
  11. )
  12. )
  13. for %%l in (txt;doc;exe;rar;mp3;jpg;wma;bat;htm;pdf;ppt) do (
  14. set hzm=%%l
  15. for /f "usebackq tokens=*"  %%i in ("%~dp0_test1.txt") do (
  16. set var=%%i
  17. for /l %%a in (0,1,1000) do (
  18. set /a ddf=%%a+4
  19. set str=!var:~%%a,4!
  20. if "!str!"==".!hzm!" echo !var:~0,%%a!.!hzm!>>"%~dp0_test2.txt"
  21. )
  22. )
  23. for /f "usebackq tokens=1,2,3,4 delims=." %%a in ("%~dp0_test2.txt") do (
  24. set vara=%%a
  25. set varb=%%b
  26. if /i "!varb:~0,3!"=="!hzm!" echo !vara!.!varb:~0,3!>>"%~dp0_test3.txt"
  27. )
  28. )
  29. for /f "usebackq delims=" %%a in (`sort "%~dp0_test3.txt"`) do (
  30. if not %%a equ !b! echo %%a>>"%~dp0_results.txt"
  31. set b=%%a)
  32. del "%~dp0_test.txt"
  33. del "%~dp0_test1.txt"
  34. del "%~dp0_test3.txt"
  35. del "%~dp0_test2.txt"
  36. start "" "%~dp0_results.txt"
  37. EXIT
复制代码

[ 本帖最后由 cjiabing 于 2010-8-21 10:42 编辑 ]

TOP

晕掉,以前长篇大论都没达到效果,以下几个字就解决了!~
因为用的是FOR,不支持那些变态文件,但基本上能满足一般使用了,比如拖入MP3播放。
  1. @echo off
  2. for /f "tokens=*" %%a in ("%*") do (
  3. for %%i in (%%a) do if exist %%i echo %%i
  4. )
  5. pause
复制代码

TOP

本帖最后由 cjiabing 于 2011-6-3 13:27 编辑

21# zm900612
忘记怎么说了,从实践总结出来的!~
或许,外面的FOR真的多余了,有空研究清楚了再说说道理!~
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

本帖最后由 cjiabing 于 2012-2-23 00:35 编辑

我弱弱地问,以下代码满足了楼主的要求没有?
首先,用dir来获得文件的路径(我经常用if 、dir、%fa来干这种事),有点罗嗦,对文件夹无效,可惜无法用if exist。
第二、既然%*能保存所有参数,那么把这些含有特殊符号的参数全部输入到dir,而dir是不会对文件进行操作的,所以它也可以保存内容。
第三、for虽然也是逐行逐个处理,遇到特殊符号会发生错误。但对于集合内的命令执行结果它们却视而不见,你可以先ipconfig再for,而不必考虑它输出来的是什么。
  1. @echo off
  2. ::显示所有拖入文件的路径,完美支持楼主提供的含有特殊符号的文件名。唯一不足的是不支持文件夹,文件夹需要另外想办法。
  3. echo     以下是文件:
  4. dir /b %*
  5. pause
  6. ::计算拖入文件的个数,用来验证。
  7. dir /b %*|findstr /n /i .*
  8. pause
  9. @echo off&setlocal enabledelayedexpansion
  10. ::决定还是用FOR来验证,避免无法继续下一步操作。
  11. set num=0
  12. for /f "tokens=*" %%a in ('dir /b %*') do set /a num+=1&echo;!num!:%%a
  13. pause
复制代码
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 36# flaven


    奇怪,我放在桌面上可以执行,放到驱动盘下就出错了!~
    可能路径名含有空格的时候它自动添加双引号,没有空格的时候它没有添加,所以出错了!~

原理是这样的:
1.对于“%*”直接使用    "%*"    (即echo "%*")即可解决问题,但问题是这个结果中的路径都挤到了一行里面,不方面引用。
因此需要考虑第二个问题:拆分路径并去掉双引号。
2.一般情况下,利用dir命令的特点来自动拆分路径和双引号,所以使用  dir /b %*  即可。但现在看来也是存在一定限制。
3.实在不行的情况下,又得回头使用SET替换的方式,或者使用FOR替换的方式,那样会比较麻烦点。
因为文件名含有特殊符号,所以使用双引号,但为了提前单个独立的路径又需要去掉双引号,这是一个矛盾,解决了这个问题就可以解决了这个难题。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

返回列表