Board logo

标题: [文本处理] 两个相同bat执行结果不同? [打印本页]

作者: tiandyoin    时间: 2023-10-1 14:13     标题: 两个相同bat执行结果不同?

本帖最后由 tiandyoin 于 2023-10-1 15:06 编辑

今天遇到一灵异事件,两个相同的bat(用beyondcompare比较过),其中一个 2.bat 运行后,出现语法错误,并且把目录下的所有文件全删除了。。。
起初怀疑是 endlocal 的反常用法,但是修改掉,注释掉,都还是有问题。。
下面是运行结果
  1. C:\Desktop\dos>2.bat
  2. 'se' 不是内部或外部命令,也不是可运行的程序
  3. 或批处理文件。
  4. p10=
  5. 系统找不到指定的路径。
  6. 找不到批处理文件。
  7. 找不到批处理文件。
复制代码
下面是代码,直接拷贝不能看到效果,要从网盘下载的来测试。
  1. @echo off
  2. cd /d "%~dp0"
  3. call :test1
  4. @goto :EOF
  5. :test1
  6. set /p p10=p10=&rem a><b
  7. set /p p20=p20=&rem a><b "c>|d
  8. set "$=%TEMP%\$"
  9. >nul 2>nul del /f /q "%$%"
  10. setlocal EnableDelayedExpansion
  11. set "p10=!p10! "
  12. cd.&call :Strstr p20 p10 head len
  13. echo errorlevel=%errorlevel%
  14. echo head=!head!
  15. if !head!==0 (
  16. echo test2
  17. ) else set head=&rem
  18. if defined head (echo test3 & (echo.!p20:~%head%!)>"!$!") else echo test4
  19. endlocal
  20. if exist "%$%" set /p p20=<"%$%"
  21. @set p20&pause
  22. @goto :EOF
  23. @rem Usage:
  24. rem 功能: 查找子串 s2 在字符串 s1 中的位置。
  25. :Strstr <&s1, &s2, &s1.Location, &s2.Length>
  26. @if "%~1%~1"=="" exit /b 1
  27. @if "%~2%~2"=="" exit /b 1
  28. @if "%~3%~3"=="" exit /b 1
  29. @if "%~4%~4"=="" exit /b 1
  30. set %~3=&rem
  31. set %~4=&rem
  32. setlocal EnableDelayedExpansion
  33. set i=-1
  34. :Loop_i
  35. set /a i+=1
  36. set j=-1
  37. :Loop_j
  38. set /a j+=1
  39. set /a k=!i!+!j!
  40. call set "$1=%%%~1:~!k!,1%%"
  41. call set "$2=%%%~2:~!j!,1%%"
  42. if defined $1 if defined $2 (
  43. @if /i not "!$1!!$1!"=="!$2!!$2!" goto :Loop_i
  44. )
  45. if not defined $2 (
  46. endlocal & set %~3=%i% & set %~4=%j%
  47. @set %~3&set %~4&pause
  48. @exit /b 0
  49. )
  50. @if not defined $1 exit /b 1
  51. @goto :Loop_j
  52. @exit /b 0
复制代码
链接:https://pan.baidu.com/s/1AOse72_L49su7VFAclEFgA?pwd=tc98
提取码:tc98
作者: 77七    时间: 2023-10-1 14:29

换行符不同
作者: tiandyoin    时间: 2023-10-1 15:05

回复 2# 77七


    万分感谢!可还有一个问题,输入
        set /p p10=p10=&rem a><b
        set /p p20=p20=&rem a><b "c>|d
后, head 是等于 0 ,但是没打印 test2
作者: 77七    时间: 2023-10-1 15:23

回复 3# tiandyoin


  
  1. echo head=#!head!#
复制代码
  1. head=#0 #
复制代码

作者: 77七    时间: 2023-10-1 15:32

本帖最后由 77七 于 2023-10-1 15:33 编辑
  1. @echo off
  2. set a=1 &set b=2
  3. echo %a%#
  4. set "a=1"&set b=2
  5. echo %a%#
  6. set "a=1" &set b=2
  7. echo %a%#
  8. (set a=1)&set b=2
  9. echo %a%#
  10. set "a="
  11. pause
复制代码

作者: tiandyoin    时间: 2023-10-1 17:27

回复 5# 77七


    如果 head=3
    (echo.!p20:~%head%!)     等于   "c>|d
    (echo.!p20:~0,%head%!)  等于 p20:~0,3

第二个不求值?
作者: tiandyoin    时间: 2023-10-1 17:35

回复 6# tiandyoin

没见过 , 作为分隔符。
诶,你今天总算见到了~

echo.!p20:~0^,%head%!

就会求值
作者: 77七    时间: 2023-10-1 18:50

本帖最后由 77七 于 2023-10-1 18:59 编辑

回复 6# tiandyoin


  1. @echo off
  2. set str=123456
  3. setlocal enabledelayedexpansion
  4. echo %str:~0,2%
  5. echo,%str:~0,2%
  6. echo=%str:~0,2%
  7. echo.%str:~0,2%
  8. echo !str:~0,2!
  9. echo,!str:~0,2!
  10. echo=!str:~0,2!
  11. echo.!str:~0,2!
  12. pause
复制代码

批处理技术内幕:ECHO命令




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