Get-Content -Wait在读取文件时锁定文件,阻止Add-Content写入数据

时间:2015-06-09 13:35:20

标签: powershell powershell-v3.0

我使用powershell来编写和读取日志文件。

一个脚本正在使用Add-Content生成日志文件。另一个脚本是使用Get-Content -Wait来拖尾日志文件。这似乎应该非常可靠。

但是,作者经常无法写作,而且读者经常无法阅读和放弃。我只能假设这两个命令没有用适当的访问标志打开文件,所以他们互相争斗。

这是一个令人讨厌的小脚本,它演示了同一进程中两个作业的问题,尽管在不同的PowerShell进程之间也是如此:

$writer = start-job -ScriptBlock {     
    foreach($i in 1..500)
    {
        "$i" | Add-Content "c:\temp\blah.txt"
        Sleep -Milliseconds 10
    }
}

$reader = start-job -ScriptBlock { 
    Get-Content "c:\temp\blah.txt" -wait
}

while($writer.State -eq "Running")
{
    Sleep 1
}
Sleep 2

"Checking writer"
receive-job $writer

"Checking reader"
receive-job $reader

remove-job $writer -force
remove-job $reader -force

在使用PowerShell 3 ISE的Windows 7 x64计算机上,我通常会遇到大量写入错误:

Checking writer
The process cannot access the file 'C:\temp\blah.txt' because it is being used by another process.
    + CategoryInfo          : ReadError: (C:\temp\blah.txt:String) [Get-Content], IOException
    + FullyQualifiedErrorId : GetContentReaderIOError,Microsoft.PowerShell.Commands.GetContentCommand
    + PSComputerName        : localhost

然后正在阅读的文件中存在空白:

Checking reader
...
23
24
25
54
55
56
...

注意这是与此处讨论的问题不同的问题:Get-Content -wait not working as described in the documentation和此处:https://social.technet.microsoft.com/Forums/windowsserver/en-US/e8ed4036-d822-43d3-9ee5-dd03df3d9bfc/why-doesnt-wait-work-and-why-doesnt-anyone-seem-to-care?forum=winserverpowershell这些问题涉及拖尾文件,这些文件在写入之间不会被关闭。

有没有办法像这样使用Get-Content和Add-Content,还是应该放弃,使用别的东西来读写我的日志文件?

1 个答案:

答案 0 :(得分:2)

尝试使用Out-File而不是Add-Content

替换

Out-File "c:\temp\blah.txt" -Append -Encoding ascii

使用:

{{1}}

您需要将编码指定为带有Out-File的ascii,如果这是您想要的,因为它是add-content的默认值,但不是out-file的默认值。您还需要使用-append和/或-noclobber来避免覆盖现有文件内容。