.net - Seek 方法在 Powershell 脚本中不起作用

标签 .net powershell file-io seek

我正在尝试使用 .net API 来查找大型数据文件。由于某种原因我无法让它发挥作用。 这是我的代码:

function check_logs{
  $pos = 8192
  $count = 1
  $path = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Log\ERRORLOG.2'
  $br = 0
  $reader = [System.IO.File]::OpenText($path)
  $reader.DiscardBufferedData()
  $reader.BaseStream.Seek(0, [System.IO.SeekOrigin]::Begin)
    for(;;){
    $line = $reader.ReadLine()
    if($line -ne $null){$br = $br + [System.Text.Encoding]::UTF8.GetByteCount($line)}
    if($line -eq $null -and $count -eq 0){break}
    if($line -eq $null){$count = 0}
    elseif($line.Contains('  Error:')){
        Write-Host "$line  $br"
    }
}

}

如果我使用0作为seek方法的参数,它会按预期从头开始查找,但它也会在写入读取的行之前将0写入控制台。示例:

 0
 2011-08-31 09:26:36.31 Logon       Error: 17187, Severity: 16, State: 1.  4101
 2011-08-31 09:26:36.32 Logon       Error: 17187, Severity: 16, State: 1.  4489
 2011-08-31 09:26:38.25 Logon       Error: 17187, Severity: 16, State: 1.  4929
 2011-08-31 09:26:38.25 Logon       Error: 17187, Severity: 16, State: 1.  5304
 2011-08-31 09:26:43.75 Logon       Error: 17187, Severity: 16, State: 1.  6120

如果我尝试使用 4096 而不是 0 进行查找,它只会写出:

4096

我原以为除了前两行之外,它会写出与第一行相同的行。

有人能看到这个问题吗?我还有另一个问题让我想到了这一点。有关更多背景信息,请参阅 this

编辑:仍在尝试解决这个问题。有谁知道我还可以在哪里找到有关此问题的信息?是否可以向 Microsoft 脚本人员发送问题?

致以诚挚的问候

吉斯利

最佳答案

Seek 方法返回流中的新位置,这就是您打印出数字的原因。

至于为什么你没有得到输出:

  1. 确认文件大小大于 4K。
  2. 尝试打印所有行,而不是仅打印包含“Error”一词的行。这可能会给你一个线索
  3. StreamReader 是基本流的缓冲包装器,因此 Seek 和 Position 可能不会像您期望的那样工作。考虑http://geekninja.blogspot.com/2007/07/streamreader-annoying-design-decisions.html 。尝试在搜索之前添加对$reader.DiscardBufferedData()的调用。

关于.net - Seek 方法在 Powershell 脚本中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7269477/

相关文章:

powershell - 如何创建一个关联数组,最好是单行?

java - 从单个流中读取多个文件

.net - 为什么我的 iSeries/ASP.NET MVC 4 应用程序中没有重用连接?

powershell - System.IO.FileInfo 对象的不存在的 LiteralPath 属性绑定(bind)到参数

c# - 在这种情况下 Dispose() 会导致提前释放资源吗?

powershell - 可能会减慢PowerShell递归搜索的速度吗?

c# - 重用文件流

python - 以附加模式将子进程输出转储到文件中

c# - 将行号添加到以 Release模式部署的 ASP.NET 网站的堆栈跟踪

c# - WPF TreeView : Why does virtualizing break BringIntoView()?