【发布时间】:2018-07-31 16:43:45
【问题描述】:
要在 powershell 中打开和读取文件,我使用以下两种方法之一:
Get-Content $path
或
[System.IO.File]::OpenRead($path)
在读取另一个进程正在使用的日志文件时,Get-Content 似乎没有任何问题。与 .NET 方法相比,powershell cmdlet 又慢又使用更多内存。但是,当我尝试使用 .NET 方法时,出现以下错误:
“进程无法访问文件‘XYZ’,因为它正被 另一个进程。”
Q1:为什么 .net 方法不能访问文件,而 powershell cmdlet 可以?
Q2:我如何使用.net 方法读取文件?由于 Get-Content 对于大约 80 MB 的日志文件来说太慢了。我通常只阅读最后一行:
$line = ""
$lineBreak = Get-Date -UFormat "%d.%m.%Y "
$bufferSize = 30
$buffer = New-Object Byte[] $bufferSize
$fs = [System.IO.File]::OpenRead($logCopy)
while (([regex]::Matches($line, $lineBreak)).Count -lt $n) {
$fs.Seek(-($line.Length + $bufferSize), [System.IO.SeekOrigin]::End) | Out-Null
$fs.Read($buffer, 0, $bufferSize) | Out-Null
$line = [System.Text.Encoding]::UTF8.GetString($buffer) + $line
}
$fs.Close()
($line -split $lineBreak) | Select -Last $n
}
Author to original code on StackOverflow
非常感谢任何帮助!
PS!我正在使用 powershell 2.0 并且无法终止正在使用该文件的进程。我也没有文件的写权限,只能读。
【问题讨论】:
标签: .net powershell powershell-2.0