批处理或VB脚本将日志从多个目录复制到一个目录并重命名以避免冲突

时间:2011-10-19 15:53:34

标签: vbscript batch-file

希望你能提供帮助。我一直试图解决这个问题一个星期,但没有到达任何地方,不能完全拼凑我需要的东西! - 我的脚本技巧远远不够,所以请原谅我的天真! 好的,问题...... 我有一个IIS服务器有多个站点,所有站点都将他们的日志保存在一个单独的目录中,我需要将日志从过去24小时复制到我的机器上的本地目录,以便我可以在Log Parser Lizard中分析这些(GUI版本)以一天为周期。 我可以通过硬件VPN将驱动器从远程服务器映射到本地计算机,这样可以使事情变得更容易。使用forfiles命令我可以重新诅咒目录以查找只有一天的日志,并使用copy / xcopy /或Robocopy我可以设置要复制的命令。我的问题是IIS日志都具有相同的名称,因此我的复制命令只是保留覆盖以前的文件,而不是创建新文件。我已经尝试使用%random%参数作为文件名,但是这又创建了一个被下一个文件覆盖的随机文件,保留了相同的名称,而不是在一个目录中创建大量随机命名的文件。 我知道Log Parser命令包括recurse,我已经成功使用了,但是日志的格式稍有改变,GUI Lizard无法读取其中的数据,所以这不是解决方案。 我现在的代码如下所示,IP因为显而易见的原因而改变了。任何帮助将不胜感激!

@echo off

NET使用Q:/删除/是

NET USE Q:\ 255.255.255.255 \ D $ \ Logs

cd C:

RD / S / Q C:\ Weblogs \ Production

MD C:\ Weblogs \ Production

forfiles.exe / p Q:\ / s / m * .log / d 0 / c“cmd / c robocopy / S / XC / XN / XO @file C:\ Weblogs \ Production \%random%.log “

NET USE Q:/ delete

出口

1 个答案:

答案 0 :(得分:0)

在这种情况下,

%RANDOM%对你不起作用,因为它不会在每次迭代时得到解决,而只能在forfiles调用时解析一次。

您需要在FORFILES中使用一些唯一标识符,如果您只有一个级别的深度递归,可能会连接@RELPATH@FNAME可能对您有效。

或者用FORFILES循环替换FOR。在循环内部,您可以更自由地计算唯一ID,也许一个简单的计数器可能适合您。

编辑:请参阅此简单的代码示例,以帮助您入门

@ECHO off
SETLOCAL enabledelayedexpansion
SET destdir=C:\LOGS
SET count=%RANDOM%
FOR /R %%A IN (*.log) DO (
  SET /A count += 1
  @ECHO COPY %%A !destdir!\%%~nA.!count!.log
)