返回列表 发帖
第二题,终于能兼容特殊字符,还真是费了番脑筋
@echo off
set str=ABDEFG
set dst=bathome
for /f "delims=" %%i in ('findstr /n .* 12.txt') do (
    set "var=%%i"
    setlocal enabledelayedexpansion
    set var=!var:*:=!
    if defined var (
        set var=!var!//巭//
        set "result="
        call :loop
        echo !result:~,-5!
    ) else echo.!var!
    endlocal
)
pause&exit/b
:loop
set tail=!var:*%str%=!
if "!tail!"=="!var!" (set result=!result!!tail!&goto :eof)
rem set head=!var:%tail%=!
rem 这里用%tail%会导致无法兼容特殊字符
for /f "delims=" %%a in ("!tail!") do set head=!var:%%a=!
rem 上面用for变量中介,虽然开启了变量延迟但即使变量tail中含有感叹号也不影响。
set left=!head:%str%=!
if "!left!%str%"=="!head!" (set result=!result!!left!%dst%) else set result=!result!!head!
set var=!tail!
goto loopCOPY
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

返回列表