我有一个脚本,用于搜索最新修改的日志文件。然后假设读取该文本文件并选取一个关键短语,然后在其后显示该行。
到目前为止我有这个
$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目录
中不存在一个或多个成员
他们试图到达这里的关键信息是
有人可以帮忙吗? 感谢
答案 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
(不带扩展名的名称),或修改正则表达式。