1

我有一个脚本,它使用 robocopy 传输文件并将日志写入文件“Logfile.txt”之后,我进一步解析文件“LogFile.txt”并浏览必要的数据并将其写入其他名为“LogFile_Parsed.txt”的文本文件。 Txt”。我的问题在这里结束了。最初我计算行数并解析每一行;我的目标是当我到达与单词相匹配的行时 skipped ,如果行号是 x;我会将 (x-5) 到 (x+1) 行附加到新的日志文件“LogFile_Parsed.Txt”中。我在说的那一行在下面;

               Total    Copied   Skipped  Mismatch    FAILED    Extras
Dirs :         1         1         0         0         0         0

现在,我被困在哪里;我只想将这些行附加到已解析的日志字段中,当跳过或失败的行下方的数字大于 0 时;即喜欢以下;

               Total    Copied   Skipped  Mismatch    FAILED    Extras
Dirs :         1         1         1         0         1         0

怎么做到呢?我提到的上述两行在整个日志文件中是一致的。我怎样才能知道跳过或失败的数字的确切位置并阅读它?请让我知道您的宝贵建议。

4

1 回答 1

1

如果我理解正确,您想在“已跳过”下面的列中找到任何带有“已跳过”一词的行,然后是带有数字 1 的行,并将这两行和前五行附加到一个新文件中?

  1. 将 LogFile.txt 读入数组
  2. 遍历数组搜索带有“已跳过”的行
  3. 每当找到一个时,使用正则表达式匹配来查看下一行(即数组的下一个元素)在相应位置是否有 1
  4. 使用数组切片获取当前元素之前的 5 到 1 之后的元素,并将其附加到新文件中

如果所有匹配行的格式都如您的示例中所示,则以下内容将起作用:

$logfile = gc '<path>\Logfile.txt'
for ($i = 0; $i -lt $logfile.count; $i++) {
    if ($logfile[$i] -match 'Skipped') {
        if ($logfile[$i + 1] -match '(?<=Dirs :(\s+[0-9]+){2}\s+)1') {
            $logfile[($i - 5)..($i + 1)] | Out-File -Append '<path>\Logfile_Parsed.txt'
        }
    }
}

如果列的数量和顺序可能不同,则需要使用捕获组来查找“已跳过”的序数位置,并检查下一行的相应位置是否有 1。这有点复杂,所以如果这足够了,我不会进入。

于 2013-07-21T01:28:29.587 回答