这是一个概念性问题,我只是在脑子里短暂思考了一下。我知道该怎么做,但它似乎比我想象的要复杂得多。
一种常见的需求是搜索文件(例如可能是错误日志),我想在文件中搜索一个特定的字符串值。但是在我的例子中,我认为某些应用程序在一行上输出错误,但包含错误文本的行可能位于该日志的前面或前面一行(例如 SQL Server 错误日志)。因此在这种情况下,我可能希望包括在搜索中找到的包含特定字符串的行,但包括其前后的行(甚至行)。
我尽量让脚本尽可能简单,以便其他人使用或找到它时可以阅读。我无法想象这会写得太简单。
编辑
根据提供的答案,Select-String
这是我尝试做的一个例子:
[void][System.Reflection.Assembly]::[LoadWithPartialName]('Microsoft.SqlServer.SMO')
$s = New-Object Microsoft.SqlServer.Management.Smo.Server MyServer
$s.EnumErrorLogs() | select -ExpandProperty Name |
foreach { $s.ReadErrorLog($_) | select-string -Pattern "*Serverity: 25*" -Context 3 -SimpleMatch |
select LogDate, ProcessInfo, Text
答案1
Select-String
带有的 cmdlet几乎-Context
完全匹配您要执行的操作...它将读取文件的内容并搜索字符串,返回该字符串上方和下方的 3 行:
$file = C:\Users\Public\Documents\log.txt
$string = "*error*"
Get-Content $file | Select-String $string -Context 3 -SimpleMatch
默认情况下Select-String
使用正则表达式,但-SimpleMatch
会进行纯文本搜索。