Board logo

标题: 批处理按条件获取TXT文件内容(已解决)感谢Hanyeguxing [打印本页]

作者: wmysbbs     时间: 2009-6-25 10:32    标题: 批处理按条件获取TXT文件内容(已解决)感谢Hanyeguxing

有个问题请教一下


A.TXT文本内容:

状态 游戏名称 开始时间 结束时间 下载版本 任务说明
成功 地下城与勇士 20090625 14:23:40 2009
成功 特种部队 20090625 15:08:13 2009
成功 FIFA Online2 20090625 15:25:19 2009
成功 机战Online 20090625 15:41:31 2009
成功 大话西游 20090625 15:49:55 2009
成功 跑跑卡丁车 20090628 15:42:58 2009


功能要求应该是这样:

读取A.txt的内容,把日期为今天的和显示"成功"的都输出到 今天更新.txt里面,只要第二个字段就可以了,也就是游戏名

然后再根据 今天更新.txt 执行xcopy



问题解决了,在18楼,感谢Hanyeguxing的热心帮助




最终代码


@echo off&&setlocal enabledelayedexpansion
set datais=C:\
del !datais!今天更新.txt /f /q>nul 2>nul
del !datais!更新对比.bat /f /q>nul 2>nul
set han=%date:~0,4%%date:~5,2%%date:~8,2%
For /f "skip=1 tokens=1-3 delims=," %%a in (!datais!A.txt) do (
set gu=%%a
set ye=%%b
For /f "tokens=1-3 delims=- " %%i in ("%%c") do (
set str1=0%%j
set str2=0%%k
set xing=%%i!str1:~-2!!str2:~-2!
)
if "!gu!" == "成功" if "!xing!" == "!han!" (

@Echo xcopy F:\更多网游\!ye!\*.* H:\更多网游\!ye!\ /s/y/d/e >>!datais!更新对比.bat
@Echo xcopy F:\更多网游\!ye!\*.* K:\更多网游\!ye!\ /s/y/d/e >>!datais!更新对比.bat
@Echo xcopy F:\更多网游\!ye!\*.* N:\更多网游\!ye!\ /s/y/d/e >>!datais!更新对比.bat
@Echo xcopy F:\更多网游\!ye!\*.* Q:\更多网游\!ye!\ /s/y/d/e >>!datais!更新对比.bat
)
)
@Echo exit >>!datais!更新对比.bat
start !datais!更新对比.bat
pause

[ Last edited by wmysbbs on 2009-6-25 at 13:45 ]
作者: Hanyeguxing     时间: 2009-6-25 11:12
你的方法行不通,也许你的意思是要写成
@echo off
For /f "skip=1 tokens=1,2,3,4,5*" %%a In (更新.txt) Do (
if "%%c" == "%date:~0,4%%date:~5,2%%date:~8,2%" echo %%a %%b %%c %%d %%e >>更新2.txt
)
但这会过滤掉
成功 FIFA Online2 20090625 15:25:19 2009
这一行的。

所以,你要弄清楚“成功 FIFA Online2 20090625 15:25:19 2009”这行中,每一段的分隔符都是什么。

如果都是空格,那就需要想别的办法了

最好把你要处理的txt 文本文件打包压缩上传上来,大家好分析

[ Last edited by Hanyeguxing on 2009-6-25 at 11:20 ]
作者: wmysbbs     时间: 2009-6-25 11:15
收到,这样是不是只能输入五行
作者: wmysbbs     时间: 2009-6-25 11:16
我刚查了资料,改了一下,不过这段代码杂了,但还是可以实现我要的功能



@echo off&&setlocal enabledelayedexpansion
set datais=C:\
if exist !datais!今天更新.txt del !datais!今天更新.txt/f/q


:::::作用,取得A.txt内容,将日期格式改为00001122
For /f "tokens=1-3 delims=-" %%i in (!datais!A.txt) do (
    set str1=%%j
    set str2=%%k
    if "!str1:~1!"=="" set str1=0!str1!
    if "!str2:~1!"=="" set str2=0!str2!
    echo %%i-!str1!-!str2! >>!datais!B.txt
)


:::::作用,取得B.txt内容,将,号和-号清除
For /f "tokens=*" %%a in (!datais!B.txt) do (
set var=%%a
set "var=!var:,= !"
set "var=!var:-=!"
>>!datais!更新.txt echo !var!
)


:::::作用,取得当前日期,输出包含当前日期的内容
@echo %date:~0,4%%date:~5,2%%date:~8,2% >>!datais!当前日期.txt
for  /f "delims=" %%a in (!datais!当前日期.txt) do (
type !datais!更新.txt |findstr  "%%a">!datais!今天更新.txt
)



del !datais!当前日期.txt/f/q
del !datais!更新.txt/f/q
del !datais!B.txt/f/q
pause
作者: wmysbbs     时间: 2009-6-25 11:23
呵呵,有高手帮我简化就好了

下面要实现的就是根据“今天更新.txt“的内容来运行程序

比如:

xcopy E:\地下城与勇士\*.* F:\地下城与勇士\ /s/y/d/e


”地下城与勇士“这个内容就是根据"今天更新.txt"里面的内容获得,是变量,按每一行内容执行xcpoy
作者: Hanyeguxing     时间: 2009-6-25 11:25
给你简化一下看看。。。
最好把整个思路说清楚。。。
最后的2009是干什么用的?

[ Last edited by Hanyeguxing on 2009-6-25 at 11:37 ]
作者: wmysbbs     时间: 2009-6-25 11:26
感动。。。。
作者: wmysbbs     时间: 2009-6-25 11:27
这是A.txt最原始的内容



状态,游戏名称,开始时间,结束时间,下载版本,任务说明
成功,地下城与勇士,2009-6-25 14:23:40,2009-6-25 14:26:34,V2.42_RC3,已升级成功
成功,特种部队,2009-6-25 15:08:13,2009-6-25 15:10:22,V10119,已升级成功
成功,FIFA Online2,2009-6-25 15:25:19,2009-6-25 15:32:20,V1.0.1.6,已升级成功
成功,机战Online,2009-6-25 15:41:31,2009-6-25 15:55:39,V3200,已升级成功
成功,大话西游,2009-6-25 15:49:55,2009-6-25 15:57:58,V2.0.237,已升级成功
成功,跑跑卡丁车,2009-6-25 15:42:58,2009-6-25 16:00:02,P590,已升级成功
成功,QQTang,2009-6-25 20:58:25,2009-6-25 21:00:06,V3.2,已升级成功
成功,QQ魔域,2009-6-25 21:08:58,2009-6-25 21:10:13,V5183,已升级成功
成功,QQ音速,2009-6-25 21:10:18,2009-6-25 21:15:58,V2.1.7,已升级成功
成功,大话西游3,2009-6-25 21:15:55,2009-6-25 21:21:44,V3.0.115,已升级成功
成功,疯狂赛车,2009-6-25 21:21:44,2009-6-25 21:28:15,V2009060800,已升级成功
成功,街头篮球,2009-6-25 21:28:05,2009-6-25 21:32:24,V1.0.1.0,已升级成功
成功,QQ飞车,2009-6-25 20:44:56,2009-6-25 22:04:03,V56,已升级成功
成功,FIFA Online2,2009-6-25 22:02:25,2009-6-25 22:09:56,V1.0.1.6,已升级成功
作者: wmysbbs     时间: 2009-6-25 11:28
其实这里已经有,分隔符,只是我不会按这个分隔符获取内容
作者: wmysbbs     时间: 2009-6-25 11:30
最后得到的“今天更新.txt”的内容如下



成功 地下城与勇士 20090625 14:23:40 2009
成功 特种部队 20090625 15:08:13 2009
成功 FIFA Online2 20090625 15:25:19 2009
成功 机战Online 20090625 15:41:31 2009
成功 大话西游 20090625 15:49:55 2009
成功 跑跑卡丁车 20090625 15:42:58 2009
成功 QQTang 20090625 20:58:25 2009
成功 QQ魔域 20090625 21:08:58 2009
成功 QQ音速 20090625 21:10:18 2009
成功 大话西游3 20090625 21:15:55 2009
成功 疯狂赛车 20090625 21:21:44 2009
成功 街头篮球 20090625 21:28:05 2009
成功 QQ飞车 20090625 20:44:56 2009
成功 FIFA Online2 20090625 22:02:25 2009
作者: wmysbbs     时间: 2009-6-25 11:37


  Quote:
Originally posted by Hanyeguxing at 2009-6-25 11:25 AM:
给你简化一下看看。。。
最好把整个思路说清楚。。。
弄明白你的意思了

[ Last edited by Hanyeguxing on 2009-6-25 at 11:32 ]

呵呵,太谢谢你了,我也去多查点资料!!

今天又是有收获
作者: Hanyeguxing     时间: 2009-6-25 12:19

@echo off&&setlocal enabledelayedexpansion
del C:\今天更新.txt /f /q>nul 2>nul
set han=%date:~0,4%%date:~5,2%%date:~8,2%
For /f "skip=1 tokens=1,2,3,4,5* delims=," %%a in (A.txt) do (
set ye=%%a %%b
For /f "tokens=1,2,3,4,5,6* delims=- " %%i in ("%%c %%d") do (
set str1=0%%j
set str2=0%%k
set xing=%%l %%m
set gu=%%i!str1:~-2!!str2:~-2!
)
if "!gu!" == "!han!" echo !ye! !gu! !xing! >>C:\今天更新.txt
)
pause
你看一下。。。

[ Last edited by Hanyeguxing on 2009-6-25 at 12:43 ]
作者: wmysbbs     时间: 2009-6-25 12:32
哈哈,感谢!!这代码简单了好多!!
作者: wmysbbs     时间: 2009-6-25 12:35
set真好用!!!

我只要今天更新.txt里面的内容是第二个字段的可以吗

地下城与勇士
特种部队
......
作者: Hanyeguxing     时间: 2009-6-25 12:47
没明白你的意思:
你是说由A.txt 直接经过时间过滤出来,在今日更新.txt不要其他字段了。
还是对今日更新.txt再处理?
如果从A.txt开始做简单。。。。
要在一个帖子里把问题说清楚!
作者: wmysbbs     时间: 2009-6-25 12:50
哦,是这样的,刚才我想了想,重新整理了一下思路

功能要求应该是这样:

读取A.txt的内容,把日期为今天的和显示"成功"的都输出到 今天更新.txt里面,只要第二个字段就可以了,也就是游戏名

然后再根据 今天更新.txt 执行xcopy



就是你说的

由A.txt 直接经过时间过滤出来,在今日更新.txt不要其他字段了。

[ Last edited by wmysbbs on 2009-6-25 at 12:51 ]
作者: wmysbbs     时间: 2009-6-25 13:06
呵呵,OK了

if "!gu!" == "!han!" echo !ye:~3! >>!datais!今天更新.txt
作者: Hanyeguxing     时间: 2009-6-25 13:07

@echo off&&setlocal enabledelayedexpansion
del C:\今天更新.txt /f /q>nul 2>nul
set han=%date:~0,4%%date:~5,2%%date:~8,2%
For /f "skip=1 tokens=1-3 delims=," %%a in (A.txt) do (
set gu=%%a
set ye=%%b
For /f "tokens=1-3 delims=- " %%i in ("%%c") do (
set str1=0%%j
set str2=0%%k
set xing=%%i!str1:~-2!!str2:~-2!
)
if "!gu!" == "成功" if "!xing!" == "!han!" echo !ye!>>C:\今天更新.txt
)
pause

作者: wmysbbs     时间: 2009-6-25 13:12
谢谢Hanyeguxing


最终代码:


@echo off&&setlocal enabledelayedexpansion
set datais=C:\
del !datais!今天更新.txt /f /q>nul 2>nul
set han=%date:~0,4%%date:~5,2%%date:~8,2%
For /f "skip=1 tokens=1-3 delims=," %%a in (!datais!A.txt) do (
set gu=%%a
set ye=%%b
For /f "tokens=1-3 delims=- " %%i in ("%%c") do (
set str1=0%%j
set str2=0%%k
set xing=%%i!str1:~-2!!str2:~-2!
)
if "!gu!" == "成功" if "!xing!" == "!han!" echo !ye!>>!datais!今天更新.txt
)

For /f "delims=" %%i in (!datais!今天更新.txt) do (
@Echo xcopy C:\%%i\*.* X:\ /s/y/d/e
@Echo xcopy C:\%%i\*.* F:\ /s/y/d/e
)
pause
作者: Hanyeguxing     时间: 2009-6-25 13:20
批处理的开头都已经使用@echo off
下面就不要使用@Echo
echo off被使用过一次,只要不在使用echo on,回显都将一直关闭.
@是用来不显示echo off本身的
如果你想屏蔽执行成功或错误的消息,可以分别使用 >nul和 2>nul
例如:
del /f /q !!datais!今天更新.txt >nul
将屏蔽正常消息的,不使用/s时,也可以不用
del /f /q !!datais!今天更新.txt 2>nul
将屏蔽错误消息"系统找不到指定的文件"的(文件早已不存在)等的.
如果你担心他会产生,可以全部使用:
del /f /q !!datais!今天更新.txt >nul 2>nul

而且,
For /f "delims=" %%i in (!datais!今天更新.txt) do ( 中获取的%%i不就是上面的!ye!吗,直接在那里使用就可以了,不用在for一次..

[ Last edited by Hanyeguxing on 2009-6-25 at 13:32 ]
作者: wmysbbs     时间: 2009-6-25 13:31
好奇怪,这代码突然就用不了
作者: wmysbbs     时间: 2009-6-25 13:32
哦,明白了,现在的时间是26号了
作者: wmysbbs     时间: 2009-6-25 13:43
@echo off&&setlocal enabledelayedexpansion
set datais=C:\
del !datais!今天更新.txt /f /q>nul 2>nul
del !datais!更新对比.bat /f /q>nul 2>nul
set han=%date:~0,4%%date:~5,2%%date:~8,2%
For /f "skip=1 tokens=1-3 delims=," %%a in (!datais!A.txt) do (
set gu=%%a
set ye=%%b
For /f "tokens=1-3 delims=- " %%i in ("%%c") do (
set str1=0%%j
set str2=0%%k
set xing=%%i!str1:~-2!!str2:~-2!
)
if "!gu!" == "成功" if "!xing!" == "!han!" (

@Echo xcopy F:\更多网游\!ye!\*.* H:\更多网游\!ye!\ /s/y/d/e >>!datais!更新对比.bat
@Echo xcopy F:\更多网游\!ye!\*.* K:\更多网游\!ye!\ /s/y/d/e >>!datais!更新对比.bat
@Echo xcopy F:\更多网游\!ye!\*.* N:\更多网游\!ye!\ /s/y/d/e >>!datais!更新对比.bat
@Echo xcopy F:\更多网游\!ye!\*.* Q:\更多网游\!ye!\ /s/y/d/e >>!datais!更新对比.bat
)
)
@Echo exit >>!datais!更新对比.bat
start !datais!更新对比.bat
pause

[ Last edited by wmysbbs on 2009-6-25 at 13:45 ]