中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]批处理合并以时间命名的文件时遇到问题。
« [1] [2] »
作者:
标题: [求助]批处理合并以时间命名的文件时遇到问题。 上一主题 | 下一主题
bahaiyxl
初级用户





积分 22
发帖 10
注册 2007-2-11
状态 离线
『楼 主』:  [求助]批处理合并以时间命名的文件时遇到问题。

遇到一个问题,有一个网站使用了负载均衡。生成的日志文件为3个以前一天的日期为名称的日志。
例如今天为2007-02-02,那么文件名为:
web1-2007-02-01.log
web2-2007-02-01.log
web3-2007-02-01.log
由于此环境是使用windows2003的操作系统,而我以前接触的一直是linux。在linux下有软件可以满足这种要求。。但是windows下我没找到这种软件,所以只好使用批处理来作了。

刚才在坛子里搜索了一下,看到了两段和我要的差不多的脚本。
原贴在http://www.cn-dos.net/forum/viewthread.php?tid=24593
按照那里面的东西我写了一份脚本,内容如下:
@echo off
Rem 取1天之前的日期,取回放入变量nowdate
echo wscript.echo dateadd("d",-1,date) >%tmp%\tmp.vbs
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k
if %m% LSS 10 set m=0%m%
if %d% LSS 10 set d=0%d%
set nowdate=%y%-%m%-%d%
copy /b web1-%nowdate%.log + web2-%nowdate%.log + web3-%nowdate%.log web-%nowdate%.log
move web-%nowdate%.log d:/web/logs/web-%nowdate%.log

执行的效果有了,但是执行起来速度稍微有点慢。然后按照那个原贴里的方案改为

@echo off
Rem 取1天之前的日期,取回放入变量nowdate
echo wscript.echo dateadd("d",-1,date) >%tmp%\tmp.vbs
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo %tmp%\tmp.vbs') do (
    set y=%%i
    set m=%%j
    set d=%%k

if %m% LSS 10 set m=0%m%
if %d% LSS 10 set d=0%d%
set nowdate=%y%-%m%-%d%
copy /b web1-%nowdate%.log + web2-%nowdate%.log + web3-%nowdate%.log web-%nowdate%.log
move web-%nowdate%.log d:/web/logs/web-%nowdate%.log

可是这样改完执行以后没有反应。因为才接触这个、很菜,不明白那里出错了。请各位帮忙指点一下。谢谢

[ Last edited by bahaiyxl on 2007-2-11 at 05:42 AM ]

2007-2-11 04:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

@echo off
Rem 取1天之前的日期,取回放入变量nowdate
echo D=split(dateadd("d",-1,Date),"-")>%tmp%\tmp.vbs
echo If len(D(1))=1 then D(1)="0"+D(1)>>%tmp%\tmp.vbs
echo If len(D(2))=1 then D(2)="0"+D(2)>>%tmp%\tmp.vbs
echo wscript.echo D(0)+"-"+D(1)+"-"+D(2)>>%tmp%\tmp.vbs

for /f %%i in ('cscript /nologo %tmp%\tmp.vbs') do set nowdate=%%i
echo move web-%nowdate%.log d:/web/logs/web-%nowdate%.log
pause>nul

2007-2-11 05:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bahaiyxl
初级用户





积分 22
发帖 10
注册 2007-2-11
状态 离线
『第 3 楼』:  

谢谢,我试试。。

2007-2-11 06:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bahaiyxl
初级用户





积分 22
发帖 10
注册 2007-2-11
状态 离线
『第 4 楼』:  

谢谢,已经没有问题了。这个脚本直接执行还是不行,只好改了一下。。但是感觉改得不是很通。呵呵,还是对这个东西不是很理解。我再看看。。
现在的脚本是
@echo off
Rem 取1天之前的日期,取回放入变量nowdate
echo D=split(dateadd("d",-1,Date),"-")>%tmp%\tmp.vbs
echo If len(D(1))=1 then D(1)="0"+D(1)>>%tmp%\tmp.vbs
echo If len(D(2))=1 then D(2)="0"+D(2)>>%tmp%\tmp.vbs
echo wscript.echo D(0)+"-"+D(1)+"-"+D(2)>>%tmp%\tmp.vbs
for /f %%i in ('cscript /nologo %tmp%\tmp.vbs') do set nowdate=%%i
copy /b web1-%nowdate%.log + web2-%nowdate%.log + web3-%nowdate%.log web-%nowdate%.log
move web-%nowdate%.log d:/web/logs/web-%nowdate%.log
echo move web-%nowdate%.log d:/web/logs/web-%nowdate%.log

[ Last edited by bahaiyxl on 2007-2-11 at 06:29 AM ]

2007-2-11 06:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bahaiyxl
初级用户





积分 22
发帖 10
注册 2007-2-11
状态 离线
『第 5 楼』:  

还有一点请教一下,windows的批处理能否作到按日志内的时间进行合并,这些日志内部的内容已经是按照时间排序的。
例如
log1中内容如下:
111.222.111.222 - - [03/Apr/2002:10:30:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:10:32:47 +0800] "GET /index.html HTTP/1.1"
log2内容如下:
111.222.111.222 - - [03/Apr/2002:11:30:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:11:34:43 +0800] "GET /index.html HTTP/1.1"
log3内容如下:
111.222.111.222 - - [03/Apr/2002:09:32:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:09:39:17 +0800] "GET /index.html HTTP/1.1"

现在这种方法合并下来是这样的:
111.222.111.222 - - [03/Apr/2002:10:30:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:10:32:47 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:11:30:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:11:34:43 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:09:32:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:09:39:17 +0800] "GET /index.html HTTP/1.1"
这样的结果完全是按照文件的顺序加载的,没有按照日志内部的时间排序。
能否合并成:
111.222.111.222 - - [03/Apr/2002:09:32:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:09:39:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:10:30:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:10:32:47 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:11:30:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:11:34:43 +0800] "GET /index.html HTTP/1.1"

……搜了一下没有找到类似的信息。。实在不行就只能先将这个日志先传到linux下面,然后在那里面合下来再传回windows。呵呵

2007-2-11 06:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 6 楼』:  

@echo off
Rem 取1天之前的日期,取回放入变量nowdate
echo D=split(dateadd("d",-1,Date),"-")>%tmp%\tmp.vbs
echo If len(D(1))=1 then D(1)="0"+D(1)>>%tmp%\tmp.vbs
echo If len(D(2))=1 then D(2)="0"+D(2)>>%tmp%\tmp.vbs
echo wscript.echo D(0)+"-"+D(1)+"-"+D(2)>>%tmp%\tmp.vbs
for /f %%i in ('cscript /nologo %tmp%\tmp.vbs') do set nowdate=%%i
echo copy /b web1-%nowdate%.log + web2-%nowdate%.log + web3-%nowdate%.log web-%nowdate%.log>tep.bat
echo move web-%nowdate%.log d:/web/logs/web-%nowdate%.log>>tep.bat



tep.bat的内容是:
copy /b web1-2007-02-09.log + web2-2007-02-09.log + web3-2007-02-09.log web-2007-02-09.log
move web-2007-02-09.log d:/web/logs/web-2007-02-09.log

你什么地方有问题?那里不通?

2007-2-11 06:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 7 楼』:  

排序不是不可以.复杂而已.我P处理才接触呀!
set和for我还没搞明白呢...不好意思.

2007-2-11 06:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bahaiyxl
初级用户





积分 22
发帖 10
注册 2007-2-11
状态 离线
『第 8 楼』:  

因为开头你给的那个脚本直接执行还是不行,我以为那个就是可以直接运行的脚本了。但是没有理解透,所以只好一知半解的改了一下。感觉有点画蛇添足,呵呵。不过能出来,而且速度较快,我已经很知足了。

排序这个没有太大关系,已经很感谢了。实在不行我就放到linux下就行了。。还是觉得linux下的好使点儿,呵呵。

2007-2-11 07:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 9 楼』:  

你在windows用这个先~写的很简略.

你先看看吧.

把文件拖到程序上就可以了.:P

附件 1: SortStr.rar (2007-2-11 08:31, 37.2 K, 下载附件所需积分 1 点 ,下载次数: 13)
2007-2-11 08:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bahaiyxl
初级用户





积分 22
发帖 10
注册 2007-2-11
状态 离线
『第 10 楼』:  

thx,先看看

2007-2-11 08:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bahaiyxl
初级用户





积分 22
发帖 10
注册 2007-2-11
状态 离线
『第 11 楼』:  

不太明白这个的用途。。再试试。。

[ Last edited by bahaiyxl on 2007-2-11 at 08:42 AM ]

2007-2-11 08:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 12 楼』:  

一个叫1.txt的文本,内容:
111.222.111.222 - - [03/Apr/2002:10:30:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:10:32:47 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:11:30:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:11:34:43 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:09:32:17 +0800] "GET /index.html HTTP/1.1"
111.222.111.222 - - [03/Apr/2002:09:39:17 +0800] "GET /index.html HTTP/1.1"


把1.txt拖到我的程序上,你看看.

2007-2-11 08:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bahaiyxl
初级用户





积分 22
发帖 10
注册 2007-2-11
状态 离线
『第 13 楼』:  

哦。。这个就是排序的。。挺好用的。呵呵。谢谢。

自动输出的好做么?好做的话还是麻烦弄个自动输出的吧,十分感谢。。覆盖原文件。

[ Last edited by bahaiyxl on 2007-2-11 at 08:56 AM ]

2007-2-11 08:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 14 楼』:  

不好意思忘了上传了.

小心使用哦,直接覆盖不备份....:cool:

附件 1: SortStr.rar (2007-2-11 13:22, 36.02 K, 下载附件所需积分 1 点 ,下载次数: 15)
2007-2-11 13:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 15 楼』:  

  楼主最好把具体的需求用文字写出来,光看代码是很吃力的一件事情——因为代码有时候并不能准确表达你的意图。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-2-12 11:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: