多谢版主,那个连接我看了,不过有些迷惑。文本123.txt还是楼主原来的内容,看如下代码:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (123.txt) do (
- echo %%a|findstr ^^^^! 2>nul && echo yes
- echo %%a|findstr ^^^^! 2>nul || echo no
- )
- pause
复制代码 结果输出为- @echo off
- yes
- @echo off
- echo %var%
- yes
- echo %var%
- echo
- yes
- echo
- pause
- yes
- pause
- 请按任意键继续. . .
复制代码
这里从结果来看,%%a确实经过了两次处理,因为第三行的!var!为空,一定是扩展了。但是既然这样的话,第二行的%var%也应该会被处理,被扩展才对啊,应该也会显示为空,显示结果应该不会在加%var%才对啊。这里是一个问题。再看如下代码:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (123.txt) do (
- echo %%a|findstr ^^^! 2>nul && echo yes
- echo %%a|findstr ^^^! 2>nul || echo no
- )
- pause
复制代码 只在findstr后面少写了一个^结果就变成复制代码 这里一个^的差别怎么会这样呢?第一段代码解释为何会先显示文本里的内容而第二段不会呢?我试过了,第一段代码经过第一次预处理之后会将命令解释为findstr ^^!。第二次过后就变成查找字符^,我也验证过,无论什么字符串不管有无^用findstr查找结果都是找得到这做何解释?
我想,既然含有!需要两次处理,而在!!型变量先处理特殊字符,后扩展,而且扩展以后就原样输出,那么我尝试将%%a改成!!型,特码如下:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (123.txt) do (
- set "var=%%a"
- echo !var!|findstr ^^^! 2>nul && echo yes
- echo !var!|findstr ^^^! 2>nul || echo no
- )
- pause
复制代码 这样我想,!var!变量扩展就会延迟,先第一次预处理处理完特殊字符^,第二次处理的时候就直接查找!,正好这时候!var!也扩展,那么扩展以后!var!本身含有的不管是%还是!都不会再次处理了,但是显示结果仍然清一色no. 麻烦版主再指点一下了,这些问题真的比较伤脑筋。
[ 本帖最后由 Lumiere 于 2009-8-22 10:51 编辑 ] |