学习插入行操作遭遇!号,与添加行冲突
上次发帖得到各位老师指导,近两天一直在学习插入行等文本操作。(原帖:http://www.bathome.net/thread-10708-1-1.html)
实际处理txtsetup.sif文本时,本意是要在[sourcedisksfiles]节添加三行内容:- sun86.ime = 1,,,,,,,,2,0,0
- sun86.mb = 1,,,,,,,,2,0,0
- sun86.chm = 1,,,,,,,,21,0,0
复制代码 遇到几个问题:
一、套用寒夜版主的代码
1、文本中[sourcedisksfiles]节共有3个,只要在第一节中添加,因此套用寒夜版主上次给的批处理,使用了变量c、d作为开关,可以实现添加,但却丢失了!号:- set pth=txtsetup
- attrib -r %pth%.sif
- @echo off&setlocal enabledelayedexpansion
- set c==
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%pth%.sif"') do if "%%b"=="" (echo/) else (
- set "b=%%b"
- if "!c!!d!"=="==" if "!b:~0,1!!b:~-1!"=="[]" (
- echo sun86.ime = 1,,,,,,,,2,0,0
- echo sun86.mb = 1,,,,,,,,2,0,0
- echo sun86.chm = 1,,,,,,,,21,0,0
- set c=&set d=
- )
- if /i "!b!"=="[sourcedisksfiles]" set d==
- echo !b!
- ))>"%pth%.tmp"
复制代码 2、将开启延迟变量放到SET之后,并且不得不使用了ENDLOCAL,!号保住了,但要添加的3行却没进去。批处理如下:- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%pth%.sif"') do (
- set "b=%%b"
- set c==
- if "%%b"=="" (echo/) else (
- if "!c!!d!"=="==" if "!b:~0,1!!b:~-1!"=="[]" (
- echo sun86.ime = 1,,,,,,,,2,0,0
- echo sun86.mb = 1,,,,,,,,2,0,0
- echo sun86.chm = 1,,,,,,,,21,0,0
- set c=&set d=
- )
- @echo off&setlocal enabledelayedexpansion
- set b=!b:*:=!
- if /i "!b!"=="[sourcedisksfiles]" set d==
- echo !b!
- )
- endlocal
- ))>"%pth%.tmp"
复制代码 折腾这个批处理时进一步理解了开关标识符:开关变量c、d并非无值,=号就是它们的值。当它们的=值并存时,开关打开;当其中一个无值时,开关关闭。c开关已经提前开启,第一次遇到目标节名的时候,开启d开关,c、d两个开关同时处于开启状态,于是运行添加行动作,添加后关闭c、d两个开关。遇到后面的重复目标节名时,d开关仍然会再度打开,但c开关已经关闭了,不会再添加行——佩服这精妙的构思!
不妙的是,这么好的东西到了我手上就不听使唤了。环境一变,就应付不来了。
二、套用随风版主的代码- set pth=txtsetup
- @echo off
- (for /f "delims=" %%i in ('findstr /in .* %pth%.sif') do (
- set "str=%%i"
- if defined h set "h="
- if not defined v (
- for /f "tokens=1* delims=:" %%j in ("%%i") do (
- if /i "%%k"=="[sourcedisksfiles]" set s=1
- if defined s if /i "%%k"=="[SourceDisksFiles.ia64]" set h=a&set v=a&set "s="
- )
- )
- setlocal enabledelayedexpansion
- set str=!str:*:=!
- if not defined str (echo;) else (
- if defined h (
- echo sun86.ime = 1,,,,,,,,2,0,0
- echo sun86.mb = 1,,,,,,,,2,0,0
- echo sun86.chm = 1,,,,,,,,21,0,0
- set s=3
- )
- echo;!str!
- )
- endlocal
- ))>%pth%.tmp
复制代码 添加行成功了!
这段代码运用了3个开关:h、v、s。h、s用来检测[sourcedisksfiles]节名的发现,当遇到下一节名[SourceDisksFiles.ia64]时,s开关关闭,同时开启h、v两个开关。当发现h开关开启时,做添加行操作。操作后,v开关一直处于开启状态,再遇到后面重复的[sourcedisksfiles]节名时,无法满足if not defined v以及if defined h两个当中的任何一个了,于是就不会再添加行。
按照这个理解,我试着取消了v开关,改为if not defined h,果然成功了。这样,随风版主的开关也减至2个:h、s。
修改后的代码如下:- set pth=txtsetup
- @echo off
- (for /f "delims=" %%i in ('findstr /in .* %pth%.sif') do (
- set "str=%%i"
- if defined h set "h="
- if not defined h (
- for /f "tokens=1* delims=:" %%j in ("%%i") do (
- if /i "%%k"=="[sourcedisksfiles]" set s=1
- if defined s if /i "%%k"=="[SourceDisksFiles.ia64]" set h=a&set "s="
- )
- )
- setlocal enabledelayedexpansion
- set str=!str:*:=!
- if not defined str (echo;) else (
- if defined h (
- echo sun86.ime = 1,,,,,,,,2,0,0
- echo sun86.mb = 1,,,,,,,,2,0,0
- echo sun86.chm = 1,,,,,,,,21,0,0
- set s=3
- )
- echo;!str!
- )
- endlocal
- ))>%pth%.tmp
复制代码 修改之后,重新研究新代码。发现[SourceDisksFiles]节同时被h、s两个开关控制着,是否可以再减少一个呢?试验结论是s开关不能取消,如果取消,会造成添加混乱或者不能添加。
但是,set s=3可以取消。之所以能够在检测到下一节[SourceDisksFiles.ia64]名称的时候添加新行,是因为此时set h=a&set "s=",重新给它赋值没有意义了。当遇到后面重复的[sourcedisksfiles]节名时,会重新触发set s=1,但由于set h=a的状态没有取消,无法满足if not defined h的条件,所以新的重复节出现不会触发添加行的动作。
按照这个理解,取消set s=3后,试验成功。代码变成这样:- set pth=txtsetup
- @echo off
- (for /f "delims=" %%i in ('findstr /in .* %pth%.sif') do (
- set "str=%%i"
- if defined h set "h="
- if not defined h (
- for /f "tokens=1* delims=:" %%j in ("%%i") do (
- if /i "%%k"=="[sourcedisksfiles]" set s=1
- if defined s if /i "%%k"=="[SourceDisksFiles.ia64]" set h=a&set "s="
- )
- )
- setlocal enabledelayedexpansion
- set str=!str:*:=!
- if not defined str (echo;) else (
- if defined h (
- echo sun86.ime = 1,,,,,,,,2,0,0
- echo sun86.mb = 1,,,,,,,,2,0,0
- echo sun86.chm = 1,,,,,,,,21,0,0
- )
- echo;!str!
- )
- endlocal
- ))>%pth%.tmp
复制代码 [SourceDisksFiles.ia64]节名称不可以用[]号来代替的,把if /i "%%k"=="[SourceDisksFiles.ia64]"改成"!str:~0,1!!str:~-1!"=="[]",试验,新行未插入。
问题:
1、很奇怪为什么寒夜版主的代码改了之后就无法添加行了呢?
2、对随风版主代码 if defined h set "h="和 set str=!str:*:=!这两句所起的作用还不太理解。改是改了,知其然不知其所以然。
tmplinshi版主给的代码认真做了几遍,因为太长,就不帖了。里面有很多基础知识性的东西,还得学习。
附件:txtsetup.sif压缩件RAR格式,文本超过上传限制,分两卷(ANSI编码) |