中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-21 13:06
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]关于读取文本文件的批处理问题! 查看 945 回复 7
楼 主 [已结]关于读取文本文件的批处理问题! 发表于 2008-11-18 16:45 ·  中国 广东 深圳 罗湖区 电信
初级用户
积分 29
发帖 29
注册 2008-11-18 16:19
17年会员
UID 131353
性别 男
状态 离线
我有一个文本文件Config.ini,其内容为:
Publish=N
PublishDateTime=20081118140545
UpdateServerB=N
UpdateDateTime=20081118140545
Backup=Y
BackupDateTime=20081118144225
FallBack=N
FallbackDateTime=20080218091231


我以前写了个批处理,可以读取Config.ini文件里的内容,并进行操作,如果Publish=Y,就调用Publish.bat,并将Config.ini里面的Publish=Y改成Publish=N;同理,如果UpdateServerB=Y,就调用UpdateServerB.bat,并将UpdateServerB置为N,同时将文本中的时间PublishDateTime传递给Publish.bat和UpdateServerB.bat:
@echo off
for /f "delims=" %%a in ('findstr /i "^PublishDateTime" Config.ini') do set num=%%a
set date=%num:~15%
for /f "delims=" %%a in (Config.ini) do (
if not defined flag (call :loop "%%a" a) else call :loop "%%a"
)
exit
:loop
set num=%~1
if "%~2"=="" (set "flag=>>") else set "flag=>"
if "%~1"=="Publish=N" (
exit
)
if "%~1"=="Publish=Y" (
echo Publish=N>Config.ini
call Publish.bat %date%
goto :eof
)
if "%~1"=="UpdateServerB=Y" (
echo UpdateServerB=N>>Config.ini
call UpdateServerB.bat %date%
goto :eof
)
>>Config.ini echo %~1

但现在我想要该批处理在原有的基础上增加一个功能,可以实现如果Backup=Y,则调用Backup.bat,并将Backup=Y改成Backup=N,同时传给Backup.bat的%date%的值为文本中BackupDateTime的值;如果FallBack=Y,则调用FallBack.bat,并将FallBack=Y改成FallBack=N,同时将FallbackDateTime的值传给FallBack.bat。
我是这样写的,但不行:

@echo off
for /f "delims=" %%a in ('findstr /i "^PublishDateTime" Config.ini') do set num=%%a
set date=%num:~15%
for /f "delims=" %%a in (Config.ini) do (
if not defined flag (call :loop "%%a" a) else call :loop "%%a"
)
for /f "delims=" %%b in ('findstr /i "^BackupDateTime" Config.ini') do set num2=%%b
set bakdate=%num2:~15%
for /f "delims=" %%b in (Config.ini) do (
if not defined flag (call :loop "%%b" b) else call :bak "%%b"
)
exit
:loop
set num=%~1
if "%~2"=="" (set "flag=>>") else set "flag=>"
if "%~1"=="Publish=N" (
exit
)
if "%~1"=="Publish=Y" (
echo Publish=N>Config.ini
call Publish.bat %date%
goto :eof
)
if "%~1"=="UpdateServerB=Y" (
echo UpdateServerB=N>>Config.ini
call UpdateServerB.bat %date%
goto :eof
)
:bak
set num2=%~1
if "%~2"=="" (set "flag=>>") else set "flag=>"
if "%~1"=="Backup=N" (
exit
)
if "%~1"=="Backup=Y" (
echo Backup=N>>Config.ini
call Backup.bat %bakdate%
goto :eof
)
>>Config.ini echo %~1
谁能帮我修改一下啊?!谢了!

[ Last edited by boy on 2008-11-19 at 08:53 ]
2 发表于 2008-11-18 17:43 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
不行的具体表现是什么?
3 发表于 2008-11-18 17:59 ·  中国 广东 深圳 罗湖区 电信
初级用户
积分 29
发帖 29
注册 2008-11-18 16:19
17年会员
UID 131353
性别 男
状态 离线
Originally posted by HAT at 2008-11-18 17:43:
不行的具体表现是什么?

表现是文本Config.ini没有变化,没有被修改,而这个批处理一运行就消失了,看不到运行后显示的信息,太快了。

附上Backup.bat的内容:
@echo off
set date=%~1
start /b xcopy /s/h/r/y/c D:\Inetpub\wwwroot\whbcn\public_html\Website\*.* D:\Inetpub\wwwroot\whbcn\website_design\PublickHtml_Backup\%date%\>D:\Inetpub\wwwroot\whbcn\website_design\Log\backup\%date%.log
goto :eof
exit
4 发表于 2008-11-18 18:04 ·  中国 江西 赣州 安远县 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
@echo off
for /f "tokens=1,2 delims== " %%a in (Config.ini) do (
if /i "%%b" equ "Y" (
set %%a=Y
>>config2.ini echo %%a=N
) else (
>>config2.ini echo %%a=%%b
if /i "%%b" neq "N" set %%a=%%b
)
)

move /y config2.ini config.ini

if defined Publish call Publish.bat %PublishDateTime%
if defined UpdateServerB call UpdateServerB.bat %PublishDateTime%
if defined Backup call Backup.bat %BackupDateTime%
if defined FallBack call FallBack.bat %FallbackDateTime%


[ Last edited by tireless on 2008-11-18 at 19:17 ]
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
boy +1 2008-11-18 19:15
HAT +2 2008-11-19 10:02
5 发表于 2008-11-18 18:53 ·  中国 广东 深圳 福田区 电信
初级用户
积分 29
发帖 29
注册 2008-11-18 16:19
17年会员
UID 131353
性别 男
状态 离线
感谢tireless,太牛了,代码超级精简!
功能虽然没问题,不过有个疑问,因为批处理运行的时候我可以看到相关信息,当Backup=Y,运行到if defined FallBack call FallBack.bat %FallbackDateTime%的时候,批处理窗口显示:
..>XXecho off 'XXecho'不是内部或外部命令,也不是可运行的程序或批处理文件。

为什么不像前面的信息那样,显示
..>if defined FallBack call FallBack.bat 20080218091231
呢?

[ Last edited by boy on 2008-11-18 at 18:54 ]
6 Re 5楼 发表于 2008-11-18 20:46 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
不知道问题出在哪,我简单测试了下,好像没什么问题
7 Re 4楼 发表于 2008-11-18 20:56 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
建议在任何批处理中都不要使用和系统环境变量重名的自定义变量
如date
8 发表于 2008-11-19 08:52 ·  中国 广东 深圳 福田区 电信
初级用户
积分 29
发帖 29
注册 2008-11-18 16:19
17年会员
UID 131353
性别 男
状态 离线
Originally posted by HAT at 2008-11-18 20:56:
建议在任何批处理中都不要使用和系统环境变量重名的自定义变量
如date

是的,谢谢
论坛跳转: