标题: 怎样提取一个文件中的变量值?
[打印本页]
作者: westwind
时间: 2008-4-17 15:53
标题: 怎样提取一个文件中的变量值?
目前有一个文件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 ]
作者: 26933062
时间: 2008-4-17 16:25
你说想把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 ]
作者: westwind
时间: 2008-4-17 16:43
不好意思,我的代码里应该是call 1.bat, 而不是testC.bat,我已经改过来了,请问在call 1.bat之后,怎样在1.bat里接收这个datetime呢?如果不能传递到1.bat里面,可否直接在1.bat 里面读config.ini里面的datetime?
作者: 26933062
时间: 2008-4-17 17:03
::简化了一下,如果在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 ]
作者: westwind
时间: 2008-4-17 17:39
用你简化后的批处理测试,并将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 ]
作者: 26933062
时间: 2008-4-17 17:49
我测试没问题啊?
作者: westwind
时间: 2008-4-17 18:05
请问%~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 ]
作者: 26933062
时间: 2008-4-17 18:20
代码没问题,问题出在你的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
作者: westwind
时间: 2008-4-17 18:34
Good! 高手!
Thank You Very Much!