中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-03 10:51
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]批处理合并以时间命名的文件时遇到问题。 查看 1,901 回复 17
楼 主 [求助]批处理合并以时间命名的文件时遇到问题。 发表于 2007-02-11 04:29 ·  中国 北京 昌平区 联通
初级用户
积分 22
发帖 10
注册 2007-02-11 03:23
19年会员
UID 79206
性别 男
状态 离线
遇到一个问题,有一个网站使用了负载均衡。生成的日志文件为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 ]
2 发表于 2007-02-11 05:43 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
@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
3 发表于 2007-02-11 06:11 ·  中国 北京 昌平区 联通
初级用户
积分 22
发帖 10
注册 2007-02-11 03:23
19年会员
UID 79206
性别 男
状态 离线
谢谢,我试试。。
4 发表于 2007-02-11 06:21 ·  中国 北京 昌平区 联通
初级用户
积分 22
发帖 10
注册 2007-02-11 03:23
19年会员
UID 79206
性别 男
状态 离线
谢谢,已经没有问题了。这个脚本直接执行还是不行,只好改了一下。。但是感觉改得不是很通。呵呵,还是对这个东西不是很理解。我再看看。。
现在的脚本是
@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 ]
5 发表于 2007-02-11 06:48 ·  中国 北京 昌平区 联通
初级用户
积分 22
发帖 10
注册 2007-02-11 03:23
19年会员
UID 79206
性别 男
状态 离线
还有一点请教一下,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。呵呵
6 发表于 2007-02-11 06:53 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
@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

你什么地方有问题?那里不通?
7 发表于 2007-02-11 06:56 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
排序不是不可以.复杂而已.我P处理才接触呀!
set和for我还没搞明白呢...不好意思.
8 发表于 2007-02-11 07:10 ·  中国 北京 昌平区 联通
初级用户
积分 22
发帖 10
注册 2007-02-11 03:23
19年会员
UID 79206
性别 男
状态 离线
因为开头你给的那个脚本直接执行还是不行,我以为那个就是可以直接运行的脚本了。但是没有理解透,所以只好一知半解的改了一下。感觉有点画蛇添足,呵呵。不过能出来,而且速度较快,我已经很知足了。

排序这个没有太大关系,已经很感谢了。实在不行我就放到linux下就行了。。还是觉得linux下的好使点儿,呵呵。
9 发表于 2007-02-11 08:31 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
你在windows用这个先~写的很简略.

你先看看吧.

把文件拖到程序上就可以了.:P
附件
SortStr.rar (37.2 KiB, 下载附件所需积分 1 点, 下载次数: 13)
10 发表于 2007-02-11 08:37 ·  中国 北京 昌平区 联通
初级用户
积分 22
发帖 10
注册 2007-02-11 03:23
19年会员
UID 79206
性别 男
状态 离线
thx,先看看
11 发表于 2007-02-11 08:39 ·  中国 北京 昌平区 联通
初级用户
积分 22
发帖 10
注册 2007-02-11 03:23
19年会员
UID 79206
性别 男
状态 离线
不太明白这个的用途。。再试试。。

[ Last edited by bahaiyxl on 2007-2-11 at 08:42 AM ]
12 发表于 2007-02-11 08:44 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
一个叫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拖到我的程序上,你看看.
13 发表于 2007-02-11 08:49 ·  中国 北京 昌平区 联通
初级用户
积分 22
发帖 10
注册 2007-02-11 03:23
19年会员
UID 79206
性别 男
状态 离线
哦。。这个就是排序的。。挺好用的。呵呵。谢谢。

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

[ Last edited by bahaiyxl on 2007-2-11 at 08:56 AM ]
14 发表于 2007-02-11 13:22 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
不好意思忘了上传了.

小心使用哦,直接覆盖不备份....:cool:
附件
SortStr.rar (36.02 KiB, 下载附件所需积分 1 点, 下载次数: 15)
15 发表于 2007-02-12 11:41 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  楼主最好把具体的需求用文字写出来,光看代码是很吃力的一件事情——因为代码有时候并不能准确表达你的意图。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
论坛跳转: