中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 怎样提取一个文件中的变量值?
作者:
标题: 怎样提取一个文件中的变量值? 上一主题 | 下一主题
westwind
初级用户





积分 72
发帖 28
注册 2008-4-17
状态 离线
『楼 主』:  怎样提取一个文件中的变量值?

目前有一个文件config.ini,其内容为:
update=yes
a=sss
bak=yes
datetime=200804171356
name=t
.
.
.
我有2件事要做:
1,判断update的值是否为'yes',如果是的,就执行另一个批处理1.bat,执行完后令update=no,这个我已经实现了,但缺点是update=yes必须放在第一行:
@echo off
for /f "tokens=*" %%a in (config.ini) do (
if /I %%a==update=yes (
call 1.bat
ECHO update=no>config.ini
) else (
echo %%a>>config.ini
)
)
有谁可以帮我改改?我不想用新建一个临时文件去替换的方式实现。
2,在call 1.bat后,要提取config.ini中的变量datetime的值(这个值是随时变化的,所以我不想写死在批处理里),并传递给1.bat,或直接在1.bat里提取datetime的值,这个应该怎样实现呢?
1.bat的内容是:
xcopy /s/r/y d:\temp\*.*  e:\temp
我要datetime的值的目的是在执行完1.bat后生成一个以datetime的值为名字的log文件。
谢谢!

[ Last edited by westwind on 2008-4-17 at 04:30 PM ]

2008-4-17 15:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 2 楼』:  

你说想把datetime的值传给1.bat但是如果datetime=200804171356在update=yes的下面,就没法传给1.bat了。因为update=yes时启动了1.bat,但是还没有循环到datetime=200804171356这一行。
:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (config.ini) do (
  set str=%%a&set "num=!str:~0,8!"
  if not defined flag (
    set flag=%%a
    if "%%a"=="update=yes" (
           echo update=no>config.ini
           call testc.bat
        ) else echo %%a>config.ini
        if "!num:~0,8!"=="datetime" set dat=!str:~9!
  ) else (
      if "%%a"=="update=yes" (
             echo update=no>>config.ini
                 call testc.bat
          ) else echo %%a>>config.ini
          if "!num:~0,8!"=="datetime" set dat=!str:~9!
    )
)
echo datetime的值是 !dat!
pause
[ Last edited by 26933062 on 2008-4-17 at 04:26 PM ]



致精致简!
2008-4-17 16:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
westwind
初级用户





积分 72
发帖 28
注册 2008-4-17
状态 离线
『第 3 楼』:  

不好意思,我的代码里应该是call 1.bat, 而不是testC.bat,我已经改过来了,请问在call 1.bat之后,怎样在1.bat里接收这个datetime呢?如果不能传递到1.bat里面,可否直接在1.bat 里面读config.ini里面的datetime?

2008-4-17 16:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 4 楼』:  

::简化了一下,如果在call 1。bat之前就提取到了datetime的值,就把它当参数传给1.bat
如果call 1.bat时,还没有取到datetime的值,就在1.bat中再从config.ini中提取。
:
@echo off
for /f "delims=" %%a in (config.ini) do (
   if not defined flag (call :loop "%%a" a) else call :loop "%%a"
)
echo datetime的值是 %dat%
pause&exit
:loop
set num=%~1
if "%~2"=="" (set "flag=>>") else set "flag=>"
if "%~1"=="update=yes" (
   echo update=no%flag%config.ini
   call 1.bat %dat%
) else echo %~1%flag%config.ini
if "%num:~0,8%"=="datetime" set dat=%num:~9%
goto :eof
1.bat 内容
@echo off
if "%~1"=="" (call :lis) else set dat=%~1
echo datetime的值是 %dat%
pause
xcopy /s/r/y d:\temp\*.*  e:\temp
goto :eof
:lis
for /f "delims=" %%a in ('findstr /i "^datetime" config.ini') do set num=%%a
set dat=%num:~9%
goto :eof
[ Last edited by 26933062 on 2008-4-17 at 05:06 PM ]



致精致简!
2008-4-17 17:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
westwind
初级用户





积分 72
发帖 28
注册 2008-4-17
状态 离线
『第 5 楼』:  

用你简化后的批处理测试,并将config.ini调整为:
datetime=200804171356
update=yes
a=sss
bak=yes
name=t
发现运行后,update以下的参数都没了。。
只有
datetime=200804171356
update=no

[ Last edited by westwind on 2008-4-17 at 05:45 PM ]

2008-4-17 17:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 6 楼』:  

我测试没问题啊?



致精致简!
2008-4-17 17:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
westwind
初级用户





积分 72
发帖 28
注册 2008-4-17
状态 离线
『第 7 楼』:  

请问%~1和%~2分别是什么意思?
这段代码好象跟config.ini的内容顺序有关系,如果datetime在update的后面批处理会出问题,即config.ini像这样:
update=yes
datetime=200804171356
a=sss
bak=yes
name=t

不过用回原来你简化前的就可以了,你测试是用的简化后的代码测的?

[ Last edited by westwind on 2008-4-17 at 06:15 PM ]

2008-4-17 18:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 8 楼』:  

代码没问题,问题出在你的1.bat上面,
当update=yes时,config.ini的内容已经重写了,但还没有datetime这一行。
所以1.bat也找不到这一行。
这样好了1。bat内容:
@echo off
set dat=%~1
echo datetime的值是 %dat%
pause
xcopy /s/r/y d:\temp\*.*  e:\temp
goto :eof

@echo off
for /f "delims=" %%a in ('findstr /i "^datetime" config.ini') do set num=%%a
set dat=%num:~9%
for /f "delims=" %%a in (config.ini) do (
   if not defined flag (call :loop "%%a" a) else call :loop "%%a"
)
echo datetime的值是 %dat%
pause&exit
:loop
set num=%~1
if "%~2"=="" (set "flag=>>") else set "flag=>"
if "%~1"=="update=yes" (
   echo update=no%flag%config.ini
   call 1.bat %dat%
) else echo %~1%flag%config.ini
goto :eof




致精致简!
2008-4-17 18:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
westwind
初级用户





积分 72
发帖 28
注册 2008-4-17
状态 离线
『第 9 楼』:  

Good! 高手!
Thank You Very Much!

2008-4-17 18:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: