【问题标题】:How can I slurp file names from a RoboCopy log?如何从 RoboCopy 日志中获取文件名?
【发布时间】:2016-12-21 23:04:24
【问题描述】:

我无法匹配 Robocopy 日志文件中的文件名。在 Visual Studio 文本编辑器中制定正则表达式模式时,在 .NET 代码中不起作用。我认为这是因为 StreamReader.Readline() 正在删除 \r (0x0D) 或更改破坏了我编写的模式的行尾。我一直对此耿耿于怀,需要寻求帮助。匹配文件名有两种情况。在第一种情况下:#1 文件名后面有一个 \r (0x0D),其他情况下:#2 文件名后面有一个 \t。

在 Visual Studio 2015 中,以下模式适用于示例中的所有文件名,但在 .NET 中,.DS_Store 上没有匹配项:

(?<=New File.+)(?<=\d\t)(.*?\t|.*?\r)

日志文件:

      New Dir          7    \\vboxsvr\win8devdocs\pictures\
        New File            8196    .DS_Store
  0%  
100%  
        New File            6607    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.txt   17:58 -> 17:58
  0%  
100%  
        New File         1198408    IMG_20131124_125621_954.jpg 17:58 -> 17:58
  0%  
 21%  
 43%  
 65%  
 87%  
100%  
        New File         1132046    IMG_20131212_104250_300.jpg 17:58 -> 17:58

读取 Robocopy 文件并保存复制文件的文件名和目录的方法(但不处理复制失败):

private void LogCopiedFiles(string absRoboLogPath, string absFileCopyListLog) {
    try {
        UTF8Encoding encoder = new UTF8Encoding(true);
        using(FileStream write = File.OpenWrite(absFileCopyListLog)) 
        using(StreamReader read = File.OpenText(absRoboLogPath)) {
            string currentDir = string.Empty;
            while(!read.EndOfStream) {
                string line     = read.ReadLine();
                Match newDir    = findDirNamesInLog.Match(line);
                Match newFile   = findFileNamesInLog.Match(line);

                if(newDir.Success) {
                    currentDir = newDir.Value;
                }
                else if(newFile.Success) {
                    byte[] byteLine = encoder.GetBytes(string.Concat(currentDir, newFile.Value, Environment.NewLine));
                    write.Write(byteLine, 0, byteLine.Length);
                } 
            }
        }
    }
    catch(Exception ex) {
    }
}

我可以使用什么模式来仅从 .NET 的日志中获取文件名?

【问题讨论】:

  • 仅供参考,此(?&lt;=New File.+)(?&lt;=\d\t)(?&lt;=New File.*\d\t) 相同。虽然没有解决这个问题。
  • 啜饮在这里是一个技术术语吗?
  • 没那么多。它的 Perl 语言意味着获取。几年前我在代码注释中看到它并卡住了。

标签: .net regex


【解决方案1】:

请注意,您的原始正则表达式需要一个制表符。这就是为什么它不起作用的原因,因为这个字符串中没有标签8196 .DS_Store

编辑改用这个New File.*?\d+(?!\d)[^\S\r\n]*(\S+)

匹配

 **  Grp 0 -  ( pos 69 , len 37 ) 
New File            8196    .DS_Store  
 **  Grp 1 -  ( pos 97 , len 9 ) 
.DS_Store  

-----------------------------

 **  Grp 0 -  ( pos 132 , len 273 ) 
New File            6607    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.txt  
 **  Grp 1 -  ( pos 160 , len 245 ) 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.txt  

-----------------------------

 **  Grp 0 -  ( pos 448 , len 55 ) 
New File         1198408    IMG_20131124_125621_954.jpg  
 **  Grp 1 -  ( pos 476 , len 27 ) 
IMG_20131124_125621_954.jpg  

-----------------------------

 **  Grp 0 -  ( pos 576 , len 55 ) 
New File         1132046    IMG_20131212_104250_300.jpg  
 **  Grp 1 -  ( pos 604 , len 27 ) 
IMG_20131212_104250_300.jpg  

C# 用法示例

string [] LogLines = {
   @"      New Dir          7    \\vboxsvr\win8devdocs\pictures\                                                                                                                                                                                                                                                     ",
   @"        New File            8196    .DS_Store                                                                                                                                                                                                                                                                    ",
   @"  0%                                                                                                                                                                                                                                                                                                         ",
   @"100%                                                                                                                                                                                                                                                                                                         ",
   @"        New File            6607    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.txt   17:58 -> 17:58   ",
   @"  0%                                                                                                                                                                                                                                                                                                         ",
   @"100%                                                                                                                                                                                                                                                                                                         ",
   @"        New File         1198408    IMG_20131124_125621_954.jpg 17:58 -> 17:58                                                                                                                                                                                                                               ",
   @"  0%                                                                                                                                                                                                                                                                                                         ",
   @" 21%                                                                                                                                                                                                                                                                                                         ",
   @" 43%                                                                                                                                                                                                                                                                                                         ",
   @" 65%                                                                                                                                                                                                                                                                                                         ",
   @" 87%                                                                                                                                                                                                                                                                                                         ",
   @"100%                                                                                                                                                                                                                                                                                                         ",
   @"        New File         1132046    IMG_20131212_104250_300.jpg 17:58 -> 17:58                                                                                                                                                                                                                               "
};

Regex RxDir = new Regex(@"New Dir.*?\d+(?!\d)[^\S\r\n]*(\S+)");
Regex RxFile = new Regex(@"New File.*?\d+(?!\d)[^\S\r\n]*(\S+)");

Match matchDir;
Match matchFile;

for (int i = 0; i < LogLines.Count(); i++)
{
    string aline = LogLines[i];

    matchDir = RxDir.Match( aline );
    if ( matchDir.Success )
    {
        Console.WriteLine( "Directory = {0}", matchDir.Groups[1].Value );
    }
    else
    {
        matchFile = RxFile.Match( aline );
        if ( matchFile.Success )
        {
            Console.WriteLine( "     File = {0}", matchFile.Groups[1].Value ); 
        }
    }
}

输出

Directory = \\vboxsvr\win8devdocs\pictures\
     File = .DS_Store
     File = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaa.txt
     File = IMG_20131124_125621_954.jpg
     File = IMG_20131212_104250_300.jpg

【讨论】:

  • 不匹配。当后面有回车符或后面有制表符时,模式需要匹配文件名。正则表达式网站提到了 if then else 条件,但我不确定如何使用它或者它是否适用。
  • 不,它有效。从新的 edit 字符串复制。不知何故,旧字符串中有一些不可见的 Unicode 空白(00200C 00200B)。
  • 在运行正则表达式并使用我拥有的原始模式之前,通过在行中添加一个carrage return来解决问题。但我尝试了你的建议来标记答案。输入模式后(并仔细检查)结果是:新文件 380608 accesschk.exe。预期:accessschk.exe
  • @5HPC6Z06 - 不确定你的意思。原来的模式是没用的,从来没有工作过。您正在使用环视构造进行旋转,只是为了匹配文件或目录名称。这是从不做到这一点的方法。文件或目录名称在 捕获组 1 中。 我发布了一个 C# 使用示例,让您了解如何访问该组。 目录文件名都是用同样的方式完成的。
  • 恰恰相反,sln。我没有要求您提供什么,因此您的建议是无用且从未奏效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2011-10-05
  • 2015-04-10
  • 2021-07-24
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多