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

[文件操作] 批处理遍历bat格式文件时如何跳过自身

我有一个批处理,它的作用是遍历当前目录下的批处理文件,生成菜单后,以供调用
其中为了防止自己调用自己,加入了判断功能,当扫描到自己的时候,就跳过
但奇怪的是,当文件名中含有“空格”时,就生效,没有“空格”时,就无效
比如:当前目录下有2个批处理1.bat和2.bat,其中1.bat就是这个批处理,运行结果如下:
  1. ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
  2. ┋ BAT文件选择器,输入字母后请按下回车键  ┋
  3. ┋                                        ┋
  4. ┋(0)  1.bat                              ┋
  5. ┋(1)  2.bat                              ┋
  6. ┋                                        ┋
  7. ┋(x)  Exit                               ┋
  8. ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
  9. 请输入:
复制代码

也就是说代码中的自身判断没有起作用。
但如果将1.bat改名成1 .bat,运行结果如下:
  1. ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
  2. ┋ BAT文件选择器,输入字母后请按下回车键  ┋
  3. ┋                                        ┋
  4. ┋(0)  2.bat                              ┋
  5. ┋                                        ┋
  6. ┋(x)  Exit                               ┋
  7. ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
  8. 请输入:
复制代码

这次就生效了,代码完全相同,只是文件名不同(1.bat -> 1 .bat)
为何结果就不一样了呢?
以下是批处理的代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cls>nul
  4. set /a item=8
  5. set "self=%0"
  6. set "self=!self:~1,-1!"
  7. for /r .\ %%c in (*.bat) do (
  8.     set /a item+=1
  9. )
  10. mode con: cols=45 lines=%item%
  11. if "%1"=="h" (
  12.     for /r %%a in (*.bat) do (
  13.         if NOT %%a==!self! echo %%~nxa
  14.     )
  15.     echo;
  16.     exit
  17. )
  18. set "table=0123456789abcdefghijklmnopqrstuvwyz"
  19. set "table2=!table!"&set /a z=35
  20. for /r %%b in (*.bat) do (
  21.     if NOT %%b==!self! (
  22.         set /a count+=1
  23.         if !count! EQU 36 goto make
  24.         set ".!table2:~0,1!=%%b"&set "table2=!table2:~1!"
  25.     )
  26. )
  27. :make
  28. for /f "delims=" %%a in ('%0 h^|findstr /o .*') do (
  29.     if !hh! EQU 35 goto loop
  30.     for /f "delims=:" %%i in ("%%a") do set /a n=%%i-2-h,h=%%i
  31.     if defined var (
  32.         set /a jj=z-n,hh+=1&set "k="
  33.         set "mm=!table:~0,1!"&set "table=!table:~1!"
  34.         if !jj! GTR 0 (
  35.             for /l %%i in (1 1 !jj!) do set "k= !k!"
  36.         ) else (
  37.             if !jj! LSS 0 (
  38.                 set "var=!var:~0,19!"&set "var=!var:*:=!"
  39.                 for /f "skip=1 delims=:" %%m in ('^(echo."!var!"^&echo.^)^|findstr /o .') do (
  40.                     set /a Bytes=35-%%m+5
  41.                 )
  42.                 for /l %%n in (1 1 !Bytes!) do set "k= !k!"
  43.             )
  44.         )
  45.         set #!hh!=┋^(!mm!^)  !var:*:=!!k!┋
  46.     )
  47.     set "var=%%a"
  48. )
  49. :loop
  50. echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
  51. echo ┋ BAT文件选择器,输入字母后请按下回车键  ┋
  52. echo ┋                                        ┋
  53. for /l %%a in (1 1 !hh!) do echo !#%%a!
  54. echo ┋                                        ┋
  55. echo ┋(x)  Exit                               ┋
  56. echo ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
  57. echo;&set num=&set /p num=请输入: &cls
  58. if /i "%num%"=="x" exit
  59. start "" "!.%num%!"
  60. goto loop
复制代码

麻烦知道的朋友指点一下,谢谢了

难道就没有人愿意帮助我一下吗?

TOP

你不做一些注释,谁有心来一行一行的分析你的代码呢,你有这样做过吗???

TOP

  在所有涉及文件名的地方,用引号对把变量括起来,带空格或特殊字符的文件路径一定要记得带引号。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

返回列表