Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件正在与.net方法一起使用,但未与powershell cmdlet一起使用_.net_Powershell_Powershell 2.0 - Fatal编程技术网

文件正在与.net方法一起使用,但未与powershell cmdlet一起使用

文件正在与.net方法一起使用,但未与powershell cmdlet一起使用,.net,powershell,powershell-2.0,.net,Powershell,Powershell 2.0,要在powershell中打开和读取文件,我使用以下两种方法之一: Get-Content $path 或 读取另一个进程正在使用的日志文件时,Get Content似乎没有任何问题。与.NET方法相比,powershell cmdlet速度较慢,占用的内存更多。但是,当我尝试使用.NET方法时,出现以下错误: “进程无法访问文件“XYZ”,因为它正被 另一个过程。” 问题1:为什么.net方法不能访问该文件,而powershell cmdlet可以 问题2:我如何使用.net方法读取文件?因

要在powershell中打开和读取文件,我使用以下两种方法之一:

Get-Content $path

读取另一个进程正在使用的日志文件时,Get Content似乎没有任何问题。与.NET方法相比,powershell cmdlet速度较慢,占用的内存更多。但是,当我尝试使用.NET方法时,出现以下错误:

“进程无法访问文件“XYZ”,因为它正被 另一个过程。”

问题1:为什么.net方法不能访问该文件,而powershell cmdlet可以

问题2:我如何使用.net方法读取文件?因为获取内容对于80MB左右的日志文件来说太慢了。我通常只读最后一行:

$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
}

非常感谢您的帮助

PS!我正在使用powershell 2.0,无法终止使用该文件的进程。此外,我没有文件的写入权限,只能读取。

像往常一样,提供了一个简洁的注释,提供了一个有效的解决方案,并暗示了一个解释:

为了防止
“进程无法访问文件'XYZ',因为它正被另一个进程使用。”
错误,您必须以共享模式打开该文件,以便其他想要写入该文件的进程不会被拒绝访问。

这就是
Get Content
(总是)在幕后所做的,这解释了为什么在使用它时问题不会出现

相比之下,默认为共享模式
FileShare.Read
,这意味着其他进程可以读取同一文件,但不能写入同一文件

因此,请改用,它允许您明确指定共享模式:

$fs = [IO.File]::Open($path, 
                  [IO.FileMode]::Open, 
                  [IO.FileAccess]::Read, 
                  [IO.FileShare]::ReadWrite)
# ...
$fs.Close()

注意,我在上面的类型名称中省略了
系统。
组件;此组件在PowerShell中始终是可选的。

如果您可以移动到更高版本的PowerShell(至少3.0版),则
获取内容-Tail
是一个不错的选择。我们广泛使用它,并且性能适合我们的场景

从文件或其他项的末尾获取指定的行数。
此参数在Windows PowerShell 3.0中引入。
您可以使用“Tail”参数名或其别名“Last”


谢谢你的解释!您能告诉我在哪里可以获得有关powershell中那些.net方法的更多信息吗?我发现的是针对.net本身的,因此使用了不同的语法,PS并不支持所有内容。@Ajama:我很乐意。我知道的唯一文档是。有一些陷阱和限制,但您应该能够从PowerShell调用大多数.NET方法。不幸的是,.NET文档没有提供切换到PowerShell语法的功能(您只能在C#、VB、F#和C++中进行选择),因此您可以在了解PowerShell语法的基础上自己解决这个问题。
$fs = [IO.File]::Open($path, 
                  [IO.FileMode]::Open, 
                  [IO.FileAccess]::Read, 
                  [IO.FileShare]::ReadWrite)
# ...
$fs.Close()