中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS疑难解答 & 问题讨论 (解答室) » [求助]ECHO的一个文件固定位置插入行的命令
作者:
标题: [求助]ECHO的一个文件固定位置插入行的命令 上一主题 | 下一主题
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
状态 离线
『第 5 楼』:  

!m!这个语法不大懂

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
状态 离线
『第 15 楼』:  

可以  看看dir的参数啊

2006-6-15 19:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: