|
mrhjzhang
初级用户
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『楼 主』:
[求助]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?
希望大虾指导一下,最好不用第三方工具。
|
|
2006-6-13 15:08 |
|
|
kcdsw
中级用户
积分 404
发帖 179
注册 2006-3-30
状态 离线
|
『第
2 楼』:
呵呵 我刚解决了一个类似的问题 希望对你有帮助
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 ]
|
|
2006-6-13 18:23 |
|
|
mrhjzhang
初级用户
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『第
3 楼』:
谢谢楼上的,有点申奥^_^,过会儿尝试中
|
|
2006-6-13 20:20 |
|
|
kcdsw
中级用户
积分 404
发帖 179
注册 2006-3-30
状态 离线
|
『第
4 楼』:
@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 ]
|
|
2006-6-13 22:39 |
|
|
mrhjzhang
初级用户
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
|
2006-6-14 23:57 |
|
|
mrhjzhang
初级用户
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『第
6 楼』:
!m![ == %day%[
[作用也搞不懂。
|
|
2006-6-15 00:54 |
|
|
kcdsw
中级用户
积分 404
发帖 179
注册 2006-3-30
状态 离线
|
『第
7 楼』:
%m% 启用变量延迟 后就需要!m! 来表达
!m![ == %day%[ 这样做的目的是防止其中一个参数为空时程序出错跳出
|
|
2006-6-15 12:24 |
|
|
mrhjzhang
初级用户
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『第
8 楼』:
基本成功,通过这次,居然连for的用法,if else的用法都学会了。
就是[ == %day%[,[的用法好奇怪啊^_^
不过细节仍然在完善中。
主要是新文件会在每行后面多个空格。
还有就是空行被过滤了
|
|
2006-6-15 14:05 |
|
|
kcdsw
中级用户
积分 404
发帖 179
注册 2006-3-30
状态 离线
|
『第
9 楼』:
空行的问题是这样 我也还没解决
多了个空格 是在你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 ]
|
|
2006-6-15 15:17 |
|
|
mrhjzhang
初级用户
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『第
10 楼』:
@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
|
|
2006-6-15 16:22 |
|
|
mrhjzhang
初级用户
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『第
11 楼』:
基本ok了。
刚才调试老错,郁闷的一塌糊涂,原来是
set day= %%i
写成了set day = %%i
结果有两个day变量(day、day )。
空格搞定,但是空行,艾,没办法。
谢谢kcdsw大虾
|
|
2006-6-15 16:24 |
|
|
mrhjzhang
初级用户
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『第
12 楼』:
还有一些除了空行比较难的
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比较大,如果已经修改过了就不拷贝。
简单说请问如何实现有选择的拷贝(如果两个文件大小一样就不拷贝,不一样才拷贝)?
^_^
|
|
2006-6-15 16:32 |
|
|
kcdsw
中级用户
积分 404
发帖 179
注册 2006-3-30
状态 离线
|
『第
13 楼』:
问题1: 没看明白
问题2: 我这里没见乱麻啊
问题3: 不知道,难道要加引号?
问题4: 用if + dir 判断修改时间!
[ Last edited by kcdsw on 2006-6-15 at 18:34 ]
|
|
2006-6-15 18:29 |
|
|
mrhjzhang
初级用户
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『第
14 楼』:
问题3: 引号加了。
问题4: 可否用文件大小代替时间?
|
|
2006-6-15 18:38 |
|
|
kcdsw
中级用户
积分 404
发帖 179
注册 2006-3-30
状态 离线
|
|
2006-6-15 19:33 |
|