原帖由 null 于 2008-8-2 01:15 发表
我失败了,但我有个问题
我的测试代码如下:
@echo off
for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
set a=%%i
set a=%a:0=%
echo %a%a%%j
)
结果为:
acb0h
a000s
a00
a
在CMD中运行
...
你的这两个代码输出的结果是理所当然的。第一个因为没有开启变量延迟,即使开启了,输出的结果也不会正确。
第二个。你测试如下代码。-
- set a=0b0c00a000s&echo %a%
- pause
复制代码 保存为bat。运行,你会发现a的值并不是你所想的那样,而是显示echo处于关闭状态。
这是因为CMD命令解释器在读到set a=0b0c00a000s&echo %a%这一条完整的语句时,发现a用%%闭合,是个变量,会把它替换成之前所赋给它的字符串常量,并把它打印出来。而在这条完整的语句之前并没有给a赋值,即是空值。所以才会显示echo处于关闭状态。请理解“一条完整的语句”的意思。
set a=0b0c00a00s&echo %a% 这才是一条完整的语句。
同样的,for语句中给a赋值,然后又在for中引用%a%,在这之前,CMD早就把它替换为空值了,所以你的代码会出错。
如何避免这种出错呢,要用到变量延迟了。
setlocal enabledelayedexpansion 这条语句的意思即是开启变量延迟。它的作用就是要告诉CMD,在读到一条完整的语句时,不要急匆匆地扩展变量。而是在执行复合语句(for语句或if语句中其后用一对圆括号闭合的所有语句称为复合语句,用&或&&连接的也是复合语句。)中的某单条语句之后,再执行变量的扩展,也就是说,这个变量扩展的行为被延后了。在开启延迟之后,在for中给变量a赋值,又在for中引用a,此时,就不应用%%将其闭合了,而是用!!。
你的代码应该是这样。-
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
- set a=%%i
- set a=!a:0=!
- echo !a!a%%j
- )
- pause
复制代码 但输出的结果仍不符合楼主的要求,这就要看你的了。
还要记得,如果在复合语句之外再次引用变量,此时它的值是在复合语句之内最后得到的值。
如下代码:-
- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (100 1 199) do set var=%%a&echo !var:~1!
- echo %var%
- pause
复制代码 关于变量延迟,搜索一下,多做测试很快就能明白了,我说的很粗糙。
[ 本帖最后由 pusofalse 于 2008-8-2 04:06 编辑 ] |