|
mrhjzhang
初级用户
 
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『楼 主』:
[求助]ECHO的一个文件固定位置插入行的命令
使用 LLM 解释/回答一下
例如在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 楼』:
使用 LLM 解释/回答一下
呵呵 我刚解决了一个类似的问题 希望对你有帮助
setlocal EnableDelayedExpansion
set m=0
for /f "tokens=*" %%s in ('findstr /v /C:"730 730" temp.ps') do (
if !m!
我来解释一下
首先用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
状态 离线
|
|
2006-6-13 20:20 |
|
|
kcdsw
中级用户
  
积分 404
发帖 179
注册 2006-3-30
状态 离线
|
『第 4 楼』:
使用 LLM 解释/回答一下
@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!
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
状态 离线
|
|
2006-6-15 00:54 |
|
|
kcdsw
中级用户
  
积分 404
发帖 179
注册 2006-3-30
状态 离线
|
『第 7 楼』:
使用 LLM 解释/回答一下
%m% 启用变量延迟 后就需要!m! 来表达
!m 
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『第 8 楼』:
使用 LLM 解释/回答一下
基本成功,通过这次,居然连for的用法,if else的用法都学会了。
就是[ == %day%[,[的用法好奇怪啊^_^
不过细节仍然在完善中。
主要是新文件会在每行后面多个空格。
还有就是空行被过滤了
|
|
2006-6-15 14:05 |
|
|
kcdsw
中级用户
  
积分 404
发帖 179
注册 2006-3-30
状态 离线
|
『第 9 楼』:
使用 LLM 解释/回答一下
空行的问题是这样 我也还没解决
多了个空格 是在你echo的语句出了问题 比如 echo 啊 >>a.txt
这样就会有空格
实际上那个if语句原来是这样的
if !m! == %day% (call :setp) & (echo %%s >>cover3.txt) else (echo %%s >>cover3.txt)
但是如果!m! 或者 %day% 为空的时候if语句会出错 所以加个
Last edited by kcdsw on 2006-6-15 at 15:19 ]
|
|
2006-6-15 15:17 |
|
|
mrhjzhang
初级用户
 
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『第 10 楼』:
使用 LLM 解释/回答一下
@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 楼』:
使用 LLM 解释/回答一下
基本ok了。
刚才调试老错,郁闷的一塌糊涂,原来是
set day= %%i
写成了set day = %%i
结果有两个day变量(day、day )。
空格搞定,但是空行,艾,没办法。
谢谢kcdsw大虾
|
|
2006-6-15 16:24 |
|
|
mrhjzhang
初级用户
 
积分 100
发帖 39
注册 2005-10-27
状态 离线
|
『第 12 楼』:
使用 LLM 解释/回答一下
还有一些除了空行比较难的
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 楼』:
使用 LLM 解释/回答一下
问题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
状态 离线
|
|
2006-6-15 18:38 |
|
|
kcdsw
中级用户
  
积分 404
发帖 179
注册 2006-3-30
状态 离线
|
|
2006-6-15 19:33 |
|