[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
第二题,终于能兼容特殊字符,还真是费了番脑筋
  1. @echo off
  2. set str=ABDEFG
  3. set dst=bathome
  4. for /f "delims=" %%i in ('findstr /n .* 12.txt') do (
  5.     set "var=%%i"
  6.     setlocal enabledelayedexpansion
  7.     set var=!var:*:=!
  8.     if defined var (
  9.         set var=!var!//巭//
  10.         set "result="
  11.         call :loop
  12.         echo !result:~,-5!
  13.     ) else echo.!var!
  14.     endlocal
  15. )
  16. pause&exit/b
  17. :loop
  18. set tail=!var:*%str%=!
  19. if "!tail!"=="!var!" (set result=!result!!tail!&goto :eof)
  20. rem set head=!var:%tail%=!
  21. rem 这里用%tail%会导致无法兼容特殊字符
  22. for /f "delims=" %%a in ("!tail!") do set head=!var:%%a=!
  23. rem 上面用for变量中介,虽然开启了变量延迟但即使变量tail中含有感叹号也不影响。
  24. set left=!head:%str%=!
  25. if "!left!%str%"=="!head!" (set result=!result!!left!%dst%) else set result=!result!!head!
  26. set var=!tail!
  27. goto loop
复制代码
1

评分人数

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 30楼 的帖子

看到有set "cr=!str:%so%%cs%=!"
使用了%cs%就注定无法完全兼容特殊字符。
试试加入一行:"ABDEFG"(带上引号)
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 40楼 的帖子

这样的用法虽然技术原理没有什么不同,但确有新意。
首先一般不易想到%%0是for的变量(帮助中提到的都是字母形式),如果不是以前对这种形式有所接触,刚见到它时我也觉得可能有问题。
其次是echo.%com%>>a.txt,并不是像echo %%0、%%1那样显式地出现for的变量,必要经过预处理,进行变量展开后才变成%6%4%1%2%1%8%2%3(注意不是%%而是%,因为变量``的值是%) 之类的字串。这样非显式出现使得%%0的作用更难弄清楚。而对于tokens=1-10,指定变量%0之后的变量引用是%1、%2等依次递增的数字(for的变量其实是%i的形式,bat中写成%%i是为了预处理),它们是隐式出现于%com%中。

在这个问题上犯迷糊很正常,没有相关水平连迷糊都犯不上(干脆不懂),实在是有新意。

[ 本帖最后由 zqz0012005 于 2009-4-24 17:07 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

预处理并非一次性处理完毕,而是边执行边处理。
set "com=!com!!``!!r!"
这个语句基本上不需要“预处理”做什么,设置变量com是语句中的命令完成的。
set ``=%%
预处理时将两个%%号变成一个,然后才是set赋值,所以变量``的值是一个%
“我认为,其实 echo.%com%>>a.txt 就是和 echo %%0 %%1 %%2 %%3 ..... 是一样的”
在预处理之前,形式上明显不同。预处理后,前者是%6%4%1%...(预处理对变量com进行展开的结果),此时才出现%n(如果对com不赋予这样的值,就没有for变量%1、%2等,所以说是隐式的),后者直接是echo %1 %2 %3...。预处理后两者才是一样。

可能是大家对“预处理”这个词的理解不一样,但只要明白语句的执行方式,不管怎么理解都一样,毕竟没有官方说法。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表