[英]Seek method not working in Powershell script
我正在尝试使用.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脚本人员发送问题?
最好的祝福
吉斯利
Seek方法返回流中的新位置,这就是打印出数字的原因。
至于为什么你没有得到输出:
$reader.DiscardBufferedData()
的调用。 我遇到了类似的问题。 搜索到的位置被打印在控制台上。 我只需要将返回值赋给某个变量,这就解决了问题。
所以代替:
$reader.BaseStream.Seek(0, [System.IO.SeekOrigin]::Begin)
我不得不写下这样的东西:
$pos = $reader.BaseStream.Seek(0, [System.IO.SeekOrigin]::Begin)
此致,Thejasvi V.
所以我终于找到了答案。 由于某些我不知道的原因,我必须使用二进制阅读器。 以下是我的完整功能:
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
}
谢谢您的帮助
吉斯利
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.