Board logo

标题: [求助]ECHO的一个文件固定位置插入行的命令 [打印本页]

作者: mrhjzhang     时间: 2006-6-13 15:08    标题: [求助]ECHO的一个文件固定位置插入行的命令

例如在winnt.sif中。

查找(findstr)
[unattend]
这一行
然后在后面加入
OemPnPDriversPath="Drv\000;Drv\001;Drv\002;Drv\003;Drv\004;Drv\005;Drv\0065;Drv\007;Drv\008"这一行。

我会用findstr查找。
但是echo好像只能在文件末尾加入。
能不能在固定位置插入,并且如何搭配findstr?
希望大虾指导一下,最好不用第三方工具。
作者: kcdsw     时间: 2006-6-13 18:23
呵呵 我刚解决了一个类似的问题  希望对你有帮助

setlocal EnableDelayedExpansion
set m=0

for /f "tokens=*" %%s in ('findstr /v /C:"730 730" temp.ps') do (
    if !m![ == %day%[ (call :setp) & (echo %%s >>cover3.txt) else (echo %%s >>cover3.txt)
    set /a m=!m! + 1
)

:setp
echo %newdata% >>cover3.txt
goto :eof


我来解释一下
首先用for + findstr (含参数) 把符合要求的数据过虑出来.
另外一个程序负责得知这个需要改动的数据的行号for+findstr,也就是这段代码里的变量%day%
然后用了计数器,每写一句加一,也就是变量%m%
当到达需要加数据的地方使用call跳转到step
step中的数据也是由其他语句生成的新数据(%newdata%),然后写入新文件cover3.txt
然后goto :eof语句负责返回刚才的if语句.以保证后续语句的正确执行.

思路:
先获得需要改动的行的行号.
然后利用for + echo 把每行写入新文件
当到达需要改动行时,中断,写入新的数据.再恢复for+echo的正常写入


写的时候我用了findstr 的一些参数,这个在帮助里都有
如果觉得效率低的话可以不用findstr  就使用for 用它逐行的处理,用if......else......来对这行进行改动

我测试过,如果将数据先set给变量 再用echo %变量% 写入文件时会对一些符号过敏.比如%.而直接用for + echo 似乎不存在这个问题(希望能者给小弟解释下?)

[ Last edited by kcdsw on 2006-6-13 at 22:30 ]
作者: mrhjzhang     时间: 2006-6-13 20:20
谢谢楼上的,有点申奥^_^,过会儿尝试中
作者: kcdsw     时间: 2006-6-13 22:39

@echo off
setlocal EnableDelayedExpansion     
set m=0                               //先生成变量%m%
del temp.ps >nul 2>nul
del cover3.txt >nul 2>nul

for /f "tokens=1,2,3,4,5,6,7" %%a in ('findstr /C:"DeviceRGB" newcover.ps') do set jpg=%%a %%b %%c %%d %%e %%f %%g                //先取得需要更改的数据 之所以用N多参数,主要时考虑以后好引用  

for /f "tokens=2,3" %%h in ('findstr /C:"setcolorspace" newcover.ps') do call :jpg %%h %%i %jpg%                         //提取数据,用来计算上一行中需要更改的新数据

for /f "tokens=*" %%t in (newcover.ps) do echo %%t >>temp.ps        //把空行过滤(因为echo不写空行的)

for /f "tokens=1 delims=:" %%m in ('findstr /P /N /C:"730 730" temp.ps') do set day=%%m  //获取行号

set /a day=%day% - 1

for /f "tokens=*" %%s in ('findstr /v /C:"730 730" temp.ps') do (
    if !m![ == %day%[ (call :setp) & (echo %%s >>cover3.txt) else (echo %%s >>cover3.txt)
    set /a m=!m! + 1
)                 //将不含730 730 的行写入新文件(这样全文少一行,就是要改的那一行),到达%day%行号时加一行进去(echo一次写一行)

del temp.ps >nul 2>nul
del newcover.ps >nul 2>nul
rename cover3.txt newcover.ps
echo 封面中的作者照片已经更改


:setp
echo %newdata% >>cover3.txt
goto :eof

:jpg
set /a a=730*%1/%2
set newdata=  %3 %4 %5 %a% %7 %8
goto :eof
[ Last edited by kcdsw on 2006-6-13 at 22:44 ]
作者: mrhjzhang     时间: 2006-6-14 23:57
!m!这个语法不大懂
作者: mrhjzhang     时间: 2006-6-15 00:54
!m![ == %day%[
[作用也搞不懂。
作者: kcdsw     时间: 2006-6-15 12:24
%m% 启用变量延迟 后就需要!m! 来表达

!m![ == %day%[ 这样做的目的是防止其中一个参数为空时程序出错跳出
作者: mrhjzhang     时间: 2006-6-15 14:05
基本成功,通过这次,居然连for的用法,if else的用法都学会了。
就是[ == %day%[,[的用法好奇怪啊^_^

不过细节仍然在完善中。
主要是新文件会在每行后面多个空格。
还有就是空行被过滤了
作者: kcdsw     时间: 2006-6-15 15:17
空行的问题是这样  我也还没解决

多了个空格 是在你echo的语句出了问题 比如 echo 啊 >>a.txt
这样就会有空格


实际上那个if语句原来是这样的

if !m! == %day% (call :setp) & (echo %%s >>cover3.txt) else (echo %%s >>cover3.txt)


但是如果!m! 或者 %day% 为空的时候if语句会出错  所以加个[符号 只是为了它永远不为空,这样if语句就不会出错退出了 这个[ 可以为任意字符的(是不是真的任意我就不知道了,只是想说这个字符是什么并不要紧)

[ Last edited by kcdsw on 2006-6-15 at 15:19 ]
作者: mrhjzhang     时间: 2006-6-15 16:22
@echo off
setlocal EnableDelayedExpansion

set addpath=OemPnPDriversPath = "Drv\000;Drv\001;Drv\002;Drv\003;Drv\004;Drv\005;Drv\0065;Drv\007;Drv\008"
set m=0
set day=0


del /f /q end.txt >nul 2>nul
del /f /q temp.txt >nul 2>nul
for /f "tokens=*" %%t in (e:\xp\i386\winnt.sif) do echo %%t>>temp.txt
for /f "tokens=1 delims=:" %%i in ('findstr /i /n /p  /c:"[Unattended]" temp.txt') do set day= %%i
cls

for /f "tokens=*" %%s in (temp.txt) do (
    if !m![ == %day%[  ( (echo %addpath%>>end.txt) & (echo %%s>>end.txt)) else echo %%s>>end.txt
    set /a m=!m! + 1
)

::: 以下是额外添加部分
@echo [GuiRunOnce]>>end.txt
@echo Command0=%systemdrive%\MyRun.bat>>end.txt

@echo [Networking]>>end.txt

@echo [NetAdapters]>>end.txt
@echo Adapter01 = params.Adapter01>>end.txt

@echo [params.Adapter01]>>end.txt

@echo [NetProtocols]>>end.txt
@echo MS_TCPIP = params.MS_TCPIP>>end.txt

@echo [params.MS_TCPIP]>>end.txt
@echo AdapterSections = params.MS_TCPIP.Adapter01>>end.txt

@echo [params.MS_TCPIP.Adapter01]>>end.txt
@echo SpecificTo = Adapter01>>end.txt
@echo IPAddress = 192.168.1.5>>end.txt
@echo SubnetMask = 255.255.255.192>>end.txt
@echo DefaultGateway = 192.168.1.1>>end.txt
@echo DNSServerSearchOrder = 192.168.1.1>>end.txt

del /f /q temp.txt >nul 2>nul
copy /y end.txt e:\xp\i386\winnt.sif >nul 2>nul
del /f /q end.txt >nul 2>nul

cls
rd /s /q "E:\XP\$OEM$"
rd /s /q "E:\ElictXP\backup"
rd /s /q "e:\xp\i386\lang"
xcopy /s /y "E:\ElictXP\Alternative\*.*" e:\xp\i386
xcopy /s /y "E:\ElictXP\$OEM$" e:\xp

exit
作者: mrhjzhang     时间: 2006-6-15 16:24
基本ok了。
刚才调试老错,郁闷的一塌糊涂,原来是
set day= %%i
写成了set day = %%i
结果有两个day变量(day、day )。
空格搞定,但是空行,艾,没办法。

谢谢kcdsw大虾
作者: mrhjzhang     时间: 2006-6-15 16:32
还有一些除了空行比较难的
1.;如何也也不过滤;号,
2.中文路径如何解决?(copy /y "E:\ElictXP\替换\*.*" e:\xp\i386)
-----------------
E:\XP>copy /y "E:\ElictXP\鏇挎崲\*.*" e:\xp\i386
系统找不到指定的路径。

3.$OEM$如何解决?(
E:\XP>rd "E:\XP\$OEM$"
拒绝访问。
-----------
xcopy /s /y "E:\ElictXP\$OEM$" e:\xp
也会只拷贝里面的目录。

4.由于某个文件如Driver.cab比较大,如果已经修改过了就不拷贝。
简单说请问如何实现有选择的拷贝(如果两个文件大小一样就不拷贝,不一样才拷贝)?

^_^
作者: kcdsw     时间: 2006-6-15 18:29
问题1: 没看明白
问题2: 我这里没见乱麻啊
问题3: 不知道,难道要加引号?
问题4: 用if + dir 判断修改时间!

[ Last edited by kcdsw on 2006-6-15 at 18:34 ]
作者: mrhjzhang     时间: 2006-6-15 18:38
问题3: 引号加了。
问题4: 可否用文件大小代替时间?
作者: kcdsw     时间: 2006-6-15 19:33
可以  看看dir的参数啊