中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结] 请教各位老师如何根据一个条件而改文件
« [1] [2] »
作者:
标题: [已结] 请教各位老师如何根据一个条件而改文件 上一主题 | 下一主题
ccccpp
新手上路





积分 17
发帖 17
注册 2008-9-14
状态 离线
『楼 主』:  [已结] 请教各位老师如何根据一个条件而改文件

修改如下
三个店,分别是A店 ,B店,C店,有一个参数文件CX.ini为:
A=192.168.1.1
B=192.168.2.2
C=192.168.3.3
在另一个TEST.INI一个参数文件中其中有一小段:
。。。
<property name="ServerIP" type="string" description="店服务器">192.168.1.1</property>
.。。。。

请问如何写出一个批处理,可通过选A或B或C 就把TEST。INI中的192.168.1.1改动,实现自动更改这个网络参数就,自动更改了TEST.INI中192.168.1.1部份,其它不用改, 谢谢

[ Last edited by ccccpp on 2009-5-24 at 03:59 ]

2009-4-28 11:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 2 楼』:  

你描述问题不清楚。
你可以使用Findstr找到符合条件的。
然后使用set %PATH:str1=str2%替换。

2009-4-28 20:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccccpp
新手上路





积分 17
发帖 17
注册 2008-9-14
状态 离线
『第 3 楼』:  

不清吗?
就是这个批处理运行后,通过选A或B或C 就把TEST。INI中的192.168.1.1改动,实现自动更改这个网络参数,谢谢

2009-4-28 22:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
freeants001
中级用户




积分 330
发帖 244
注册 2006-4-14
来自 湖北
状态 离线
『第 4 楼』:  

http://www.cn-dos.net/forum/view ... 1&highlight=sed

2009-4-28 22:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccccpp
新手上路





积分 17
发帖 17
注册 2008-9-14
状态 离线
『第 5 楼』:  

才疏学浅,看不明白,有这样的实例吗,请问,谢谢

2009-4-30 01:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yangfengoo
初级用户




积分 47
发帖 41
注册 2009-4-24
状态 离线
『第 6 楼』:  

笨鸟先飞
大大们一两行代码的事,哎新手的3个小时代价写了个猥琐的代码:
@echo off
echo ::A店IP是 192.168.1.1
echo ::B店IP是 192.168.2.2
echo ::C店IP是 192.168.3.3
echo 请选择a,b or c
@echo off
set /p m=
echo 你选择了%m% 按回车确定
pause
if %m% equ a set str=192.168.1.1
if %m% equ b set str=192.168.2.2
if %m% equ c set str=192.168.3.3

type test.ini | findstr "192.168*" >temp1.txt
for /f "tokens=1,2* delims=>" %%i in (temp1.txt) do (   
     for /f "tokens=2* delims=<" %%t in ("%%j") do (
         echo %%i^>%str%^<%%t^> >temp2.txt)   
        )

@echo off & setlocal EnableDelayedExpansion
echo.>new_TEST.INI
for /f "tokens=*" %%i in (TEST.INI) do set var1=%%i && for /f "tokens=*" %%s in (temp1.txt) do set var2=%%s && if "!var2!"=="!var1!" (for /f "tokens=*" %%t in (temp2.txt) do echo %%t>>new_TEST.INI) else (echo %%i>>new_TEST.INI)
cls
del temp1.txt
del temp2.txt
echo IP已修改至new_TEST.INI可以按"回车"将用new_TEST.INI覆盖原TEST.INI
pause
del TEST.INI
ren new_TEST.INI TEST.INI

找了半天不知道把 type test.ini | findstr "192.168*" 的返回值怎么传给FOR命令。



正在学习中……
2009-4-30 06:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccccpp
新手上路





积分 17
发帖 17
注册 2008-9-14
状态 离线
『第 7 楼』:  

谢谢这位老师,但测试过,原TEST。INI改后加多了一空行,同时,原来CX.ini参数文件就没有用了,都把参数全写进批处理了,如果要改动,又要重写一次,可不可以根据这个CX.ini里的参数需改动这个TEST。INI,这样就方便了,谢谢。

2009-5-4 00:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wuwei1dai
初级用户





积分 44
发帖 22
注册 2008-12-10
来自 广安
状态 离线
『第 8 楼』:  

@echo off
:sr
cls
echo.
echo.
echo       请输入店号(注意大小写):
set /p m=
echo 你选择了%m% 按回车确定
pause>nul
for /f "tokens=1,3" %%a in (cx.ini) do (
if %m%==%%a (
set str=%%b
goto :xg
)
)
cls
echo 你输入的店号不存在!
ping -n 3 127.1>nul
goto :sr


:xg
cls
type c:\test.ini | findstr "192.168*" >temp1.txt
for /f "tokens=1,2* delims=>" %%i in (temp1.txt) do (   
     for /f "tokens=2* delims=<" %%t in ("%%j") do (
         echo %%i^>%str%^<%%t^> >temp2.txt)   
        )

@echo off & setlocal EnableDelayedExpansion
del /f/q/a new_TEST.INI
for /f "tokens=*" %%i in (TEST.INI) do set var1=%%i && for /f "tokens=*" %%s in

(temp1.txt) do set var2=%%s && if "!var2!"=="!var1!" (for /f "tokens=*" %%t in (temp2.txt)

do echo %%t>>new_TEST.INI) else (echo %%i>>new_TEST.INI)
cls
del temp1.txt
del temp2.txt
echo IP已修改至new_TEST.INI可以按"回车"将用new_TEST.INI覆盖原TEST.INI
pause
del TEST.INI
ren new_TEST.INI TEST.INI


这下没空行,直接该CX。INI文件了,点CX。INI的格式要该成如下:
A = 192.168.1.1
B = 192.168.2.2
C = 192.168.3.3

在 = 两边加个空格,你再加多少行都可以,D E F G ……
多个字母合起也行  HJ SKJDL SKDFJKLJ  等等

2009-5-4 06:32
查看资料  发送邮件  发短消息 网志  OICQ (459253744)  编辑帖子  回复  引用回复
wuwei1dai
初级用户





积分 44
发帖 22
注册 2008-12-10
来自 广安
状态 离线
『第 9 楼』:  

if %m%==%%a  该成  if /i %m%==%%a
就不用分大小写了

2009-5-4 07:10
查看资料  发送邮件  发短消息 网志  OICQ (459253744)  编辑帖子  回复  引用回复
ccccpp
新手上路





积分 17
发帖 17
注册 2008-9-14
状态 离线
『第 10 楼』:  

谢谢,好像不太成功,只生成了两个文本文件,原文件没改

2009-5-4 22:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flybird2020
初级用户





积分 103
发帖 52
注册 2007-4-13
状态 离线
『第 11 楼』:  

你想用cx.ini内容来做变量,不想再改动BAT内容
那你这A、B、C三个选项不加回显么?
回显的话显示什么呢?如果写死,那cx.ini改了,这里一定要改
另你说有三个店,一共就三句,为何要调用cx.ini呢

代码不难,就是你这需求我搞不清楚。。。

2009-5-4 23:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccccpp
新手上路





积分 17
发帖 17
注册 2008-9-14
状态 离线
『第 12 楼』:  

是啊,当然不是三行,只是选三个,其实有12个店的,回显要不要都无所谓啦,提示一下已改动就行了,谢谢

2009-5-5 00:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flybird2020
初级用户





积分 103
发帖 52
注册 2007-4-13
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by ccccpp at 2009-5-5 12:21 AM:
是啊,当然不是三行,只是选三个,其实有12个店的,回显要不要都无所谓啦,提示一下已改动就行了,谢谢


@echo off&&setlocal enabledelayedexpansion
:start
call :delit
for /f "tokens=2 delims=>" %%a in (test.ini) do (
set itis=%%a
if "!itis:~0,7!"=="192.168" set oldip=!itis:~0,-10!&&call :startit&&exit/b
)
:startit
cls
echo 选项列表
if exist cx.ini (type cx.ini) else (echo 未发现cx.ini,请确认是否在同级目录下。&&pause>nul&&goto :eof)
echo.
set /p word=请输入您的选择:
if /i "%word%"=="" call :error
for /f "tokens=1,2 delims==" %%a in (cx.ini) do (
set ip=%%b
if "!ip:~0,7!" neq "192.168" echo 数据格式有误,请检查cx.ini。&&pause>nul&&goto start
echo 您选择的是:%%a|findstr /i "%word%"&&call :setit&&exit/b
)
:error
echo 您输入的有误,请重新输入。&&pause>nul&&goto start
:setit
for /f "delims=" %%a in (test.ini) do (
set var=%%a
set "var=!var:%oldip%=%ip%!"
>>test2.ini echo !var!
)
copy /y test2.ini test.ini>nul
echo 处理完毕,请查看。
pause>nul
:delit
if exist test2.ini del test2.ini/f/q
丑陋代码登场。。。
这里假设你的cx.ini的等号是全角下的(你发上来的代码是的),如果不是的话你自己改一下“set /p word=请输入您的选择:”下面一行的“delims=”吧。
安全起见,你的文件做好备份。

[ Last edited by flybird2020 on 2009-5-5 at 01:47 ]

2009-5-5 01:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yangfengoo
初级用户




积分 47
发帖 41
注册 2009-4-24
状态 离线
『第 14 楼』:  


@echo off&&setlocal enabledelayedexpansion
:start
call :delit
for /f "tokens=2 delims=>" %%a in (test.ini) do (
set itis=%%a
if "!itis:~0,7!"=="192.168" set oldip=!itis:~0,-10!&&call :startit&&exit/b
)
:startit
cls
echo 选项列表
if exist cx.ini (type cx.ini) else (echo 未发现cx.ini,请确认是否在同级目录下。&&pause>nul&&goto :eof)
echo.
set /p word=请输入您的选择:
if /i "%word%"=="" call :error
for /f "tokens=*" %%a in (cx.ini) do (
set ip=%%a
if "!ip:~2,7!" neq "192.168" echo 数据格式有误,请检查cx.ini。&&pause>nul&&goto start
echo 您选择的是:!ip:~0,1! |findstr /i "%word%"&&call :setit&&exit/b
)
:error
echo 您输入的有误,请重新输入。&&pause>nul&&goto start
:setit
for /f "delims=" %%a in (test.ini) do (
set var=%%a
set "var=!var:%oldip%=%ip:~2%!"
>>test2.ini echo !var!
)
copy /y test2.ini test.ini>nul
echo 处理完毕,请查看。
pause>nul
:delit
if exist test2.ini del test2.ini/f/q
变量截取
for /f "tokens=*" %%a in (cx.ini) do (
set ip=%%a
if "!ip:~2,7!" neq "192.168" echo 数据格式有误,请检查cx.ini。&&pause>nul&&goto start


set "var=!var:%oldip%=%ip:~2%!"
这样就不需要管=了。

[ Last edited by yangfengoo on 2009-5-5 at 03:43 ]



正在学习中……
2009-5-5 03:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yangfengoo
初级用户




积分 47
发帖 41
注册 2009-4-24
状态 离线
『第 15 楼』:  

这句
if "!ip:~2,7!" neq "192.168" echo 数据格式有误,请检查cx.ini。&&pause>nul&&goto start
最好该为
if "!ip:~2,7!" neq "192.168" echo 数据格式有误,请检查cx.ini。&&pause>nul&&goto startit

因为只检查cx.ini 没必要再检查test.ini



正在学习中……
2009-5-5 04:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: