Метод поиска не работает в скрипте Powershell - PullRequest
3 голосов
/ 01 сентября 2011

Я пытаюсь использовать .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 в качестве параметра для метода поиска, он ищет с самого начала, как и ожидалось, но также записывает 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

Я бы подумал, что он выведет те же строки, что и первыйделал отдельно от первых двух.

Может кто-нибудь увидеть проблему?У меня был еще один вопрос, который привел меня к этому.Для получения дополнительной информации см. это

РЕДАКТИРОВАТЬ: Все еще пытаюсь выяснить это.Кто-нибудь знает, где еще я мог бы попытаться найти информацию об этой проблеме?Можно ли отправить вопросы парню из Microsoft?

С уважением

Gísli

Ответы [ 3 ]

5 голосов
/ 01 сентября 2011

Метод Seek возвращает новую позицию в потоке, поэтому вы печатаете число.

Почему вы не получаете вывод:

  1. Убедитесь, что размер файла превышает 4K.
  2. Попробуйте распечатать все строки, а не простостроки со словом «Ошибка» в них.Это может дать вам подсказку
  3. StreamReader - буферизованная оболочка вокруг основного потока, поэтому Seek и Position могут работать не совсем так, как вы ожидаете.Рассмотрим http://geekninja.blogspot.com/2007/07/streamreader-annoying-design-decisions.html. Попробуйте добавить в вызов $reader.DiscardBufferedData() перед поиском.
0 голосов
/ 30 января 2014

У меня была похожая проблема.Отвечающая позиция печаталась на консоли.Мне просто нужно было присвоить возвращаемое значение некоторой переменной, и это решило проблему.

Поэтому вместо:

$reader.BaseStream.Seek(0, [System.IO.SeekOrigin]::Begin)

я должен был написать что-то вроде:

$pos = $reader.BaseStream.Seek(0, [System.IO.SeekOrigin]::Begin)

С уважением, Thejasvi V

0 голосов
/ 12 сентября 2011

Итак, я наконец нашел ответ. По неизвестной мне причине я должен использовать бинарный ридер. Здесь ниже моя полная функция:

 function check_logs{
 Write-Host "New test `n`n"
 $pos = 19192
 $path = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Log\ERRORLOG.2'
 $br = 0
 $b = new-object System.IO.BinaryReader([System.IO.File]::Open($path,[System.IO.FileMode]::Open));
 $required = $b.BaseStream.Length - $pos
 $b.BaseStream.Seek($pos, [System.IO.SeekOrigin]::Begin)
 $bytes = $b.ReadBytes($required)
 $log = [System.Text.Encoding]::Unicode.GetString($bytes)
 $split = $log.Split("`n")
 foreach($s in $split)
 {
     if($s.contains("  Error:"))
     {
         Write-Host $s  "`n"
     }
 }
 $b.close
 }

Спасибо за помощь

Гисли

...