搜索文本文件

时间:2015-07-22 14:35:16

标签: powershell text-files

我有一个脚本,用于搜索最新修改的日志文件。然后假设读取该文本文件并选取一个关键短语,然后在其后显示该行。

到目前为止我有这个

$logfile = get-childitem 'C:\logs' | sort {$_.lastwritetime} | where {$_ -notmatch "X|Zr" }| select -last 1
$error = get-content $logfile | select-string -pattern "Failed to Modify"

它读取的示例行是

  

20150721 12:46:26 398fbb92 CV无法修改   CN = ROLE-x-USERS,OU =角色组,OU =组,DC = gyp,DC = gypuy,DC = net   MDS_E_BAD_MEMBERSHIP目录

中不存在一个或多个成员

他们试图到达这里的关键信息是

有人可以帮忙吗? 感谢

2 个答案:

答案 0 :(得分:0)

试试这个:

$error = get-content $logfile | 
    Where-Object { $_ -like "*Failed to Modify*" } | 
    Select-Object -First 1

如果您正在寻找文件中的第一个匹配项,则提供此功能。 Select-String cmdlet返回MatchInfo个对象。根据您的要求,如果您只是想在文件中首次出现此错误,则可能没有理由添加该级别的复杂性。

如果不这样做,我的建议就是调试它并逐步完成它。中断Get-Content来电,看看$logfile是什么。运行Get-Content $logfile并查看该内容的外观。然后对该输出执行Select-String。看看MatchInfo.ToString()的样子。也许你会看到一些脱节。

同样,我的建议是手动解析文件并在此时使用Where-Object cmdlet。

答案 1 :(得分:0)

这应该起作用:

get-childitem 'c:\logs' | where {$_.Name -notmatch "X|Zr" } | sort {$_.lastwritetime}  | select -last 1 | select-string "Failed to Modify"

但我不喜欢“X | Zr”部分。如果您的日志文件具有.txt扩展名,则它不会列出它们,因为您说您不希望任何文件在整个名称中包含“x”或“zr”。使用$_.BaseName(不带扩展名的名称),或修改正则表达式。