在文本文件中搜索UNC路径内的用户名

时间:2018-04-20 09:49:06

标签: powershell search

我有一个日志文件,我想在一行中提取用户名,其中显示的是ERROR 5.

示例:

2018/04/13 10:48:04 ERROR 5 (0x00000005) Copying File \\myserver\shares\johnsmith\My Documents\examplefile.txt

我想找到字符串“johnsmith”并将其放入一个新的文本文件中。 我的想法是搜索ERROR 5,然后在第四个和第五个“\” - 字母之间找到字符串。

我在谷歌搜索时发现了这个:

(get-content C:\temp\testlog.txt)  | % { 
    if ($_ -match "ERROR 5 (0x00000005) Copying File \\myserver\shares\ (.*)") { 
        $name = $matches[1]
        echo $name
    }
}

但实际上并不奏效。

任何人都可以给我任何线索使用哪些功能?

1 个答案:

答案 0 :(得分:2)

假设文件路径始终如上所述,这应该为您提供在日志文件中找到的任何匹配行的名称,文件和错误代码:

Get-Content C:\temp\testlog.txt  |
    ForEach-Object { 
        if ($_ -match "^.*ERROR (?<ErrorCode>(\d+)) \(0x\d+\) Copying File \\\\myserver\\shares\\(?<UserName>\w+)\\My Documents\\(?<FileName>.*)$") 
        { 
            [PsCustomObject]@{
                UserName = $matches.UserName;
                FileName = $matches.FileName;
                ErrorCode = $matches.ErrorCode
        }
    }
}

输出如下:

UserName  FileName        ErrorCode
--------  --------        ---------
johnsmith examplefile.txt 5        
marysmith examplefile.txt 5        
adamsmith examplefile.txt 5        
philsmith examplefile.txt 5 

要仅捕获要归档的用户名,请将代码修改为:

Get-Content .\testlog.txt  |
    ForEach-Object { 
        if ($_ -match "^.*ERROR (?<ErrorCode>(\d+)) \(0x\d+\) Copying File \\\\myserver\\shares\\(?<UserName>\w+)\\.*$") 
        { 
            $matches.UserName
        }
    } | Out-File .\UserNames.txt