合并大量文件,仅包含部分文件名

时间:2017-01-06 12:16:43

标签: windows file batch-file vbscript scripting

我在合并通过机器监控软件生成的文件时遇到了一些问题。该软件生成的文件显示某个机器在给定时间内的状态,如下所示:

格式:Time;Machine;Status

23:40:52;KP66;ms:4
23:39:54;KP86;ms:4
23:49:24;KP86;ms:9999
23:38:17;Wasmachine1;ms:4
23:43:36;Wasmachine1;ms:9999
23:41:29;Meten1;ms:4

每隔15分钟,会生成一个包含此数据的新文件。每个文件的文件名显示日期+生成的时间,如29-02-2016-23-50.sdat(以.sdat为扩展名,可以用记事本打开)。

为了能够将这些文件正确输入可视化软件并将其可视化,我需要为某台机器记录某个状态的日期和时间。日期包含在文件名中,以及文件本身的时间。

我创建了两个单独的脚本,以便能够1.将所有文件合并到一个文本文件中,然后2.删除.sdat扩展名,因此数据显示如下:

29-02-2016-05-20 5:05:37;KP85;ms:3
29-02-2016-05-20 5:05:39;KP85;ms:9999
29-02-2016-05-20 5:06:04;KP85;ms:3
29-02-2016-05-20 5:07:51;KP86;ms:4
29-02-2016-05-20 5:17:58;KP86;ms:9999
29-02-2016-05-20 5:19:13;KP86;ms:4

问题是,因为" -05-20"部分(在日期之后)仍然存在,它不能被识别为日期,因此我无法在vis中创建日期时间字段。软件。 " 05-20"每个文件都有变化。我需要一些可以使我的数据看起来像这样的脚本:

    29-02-2016 5:05:37;KP85;ms:3
    29-02-2016 5:05:39;KP85;ms:9999
    29-02-2016 5:06:04;KP85;ms:3
    29-02-2016 5:07:51;KP86;ms:4

这些是我迄今使用的脚本。用于合并所有文件的批处理文件,包括每行开头的完整文件名:

  @echo off
    (for %%f in (*.sdat) do (
      for /f "tokens=1 delims=" %%a in (%%f) do @echo %%f %%a
    ))>Machinelogs.txt

用vbs脚本删除" .sdat"每一行都有一部分:

Const ForReading = 1
Const ForWriting = 2
Const FileIn = "Machinelogs.txt"
Const FileOut = "Machinelogs.txt"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(FileIn, ForReading)

strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, ".sdat", "")

Set objFile = objFSO.OpenTextFile(FileOut, ForWriting)
objFile.WriteLine strNewText
objFile.Close

我已经使用了另一个批处理文件来顺序调用这两个脚本。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,那么简单的事情就应该做你想做的事情:

@(For /F "Tokens=1-5* Delims=-:" %%A In ('FindStr/R "^" *.sdat'
) Do @Echo(%%A-%%B-%%C %%F)>Machinelogs.txt