编辑: Bernhard König 在 cmets 中报告说,这最终已在 Powershell 5 中得到修复。
你说的很对。 Get-Content 上的 -Wait 选项会等到文件关闭后再读取更多内容。可以在 Powershell 中演示这一点,但要正确使用循环可能会很棘手,例如:
while (1){
get-date | add-content c:\tesetfiles\test1.txt
Start-Sleep -Milliseconds 500
}
每次循环都会打开和关闭输出文件。
要演示该问题,请打开两个 Powershell 窗口(或 ISE 中的两个选项卡)。在一个输入这个命令:
PS C:\> 1..30 | % { "${_}: Write $(Get-Date -Format "hh:mm:ss")"; start-sleep 1 } >C:\temp\t.txt
这将运行 30 秒,每秒将 1 行写入文件,但不会每次都关闭和打开文件。
在另一个窗口使用Get-Content读取文件:
get-content c:\temp\t.txt -tail 1 -wait | % { "$_ read at $(Get-Date -Format "hh:mm:ss")" }
使用-Wait 选项,您需要使用 Ctrl+C 来停止命令,以便运行该命令 3 次,在前两次之后等待几秒钟在第三个给我这个输出之后更长的等待:
PS C:\> get-content c:\temp\t.txt -tail 1 -wait | % { "$_ read at $(Get-Date -Format "hh:mm:ss")" }
8: Write 12:15:09 read at 12:15:09
PS C:\> get-content c:\temp\t.txt -tail 1 -wait | % { "$_ read at $(Get-Date -Format "hh:mm:ss")" }
13: Write 12:15:14 read at 12:15:15
PS C:\> get-content c:\temp\t.txt -tail 1 -wait | % { "$_ read at $(Get-Date -Format "hh:mm:ss")" }
19: Write 12:15:20 read at 12:15:20
20: Write 12:15:21 read at 12:15:32
21: Write 12:15:22 read at 12:15:32
22: Write 12:15:23 read at 12:15:32
23: Write 12:15:24 read at 12:15:32
24: Write 12:15:25 read at 12:15:32
25: Write 12:15:26 read at 12:15:32
26: Write 12:15:27 read at 12:15:32
27: Write 12:15:28 read at 12:15:32
28: Write 12:15:29 read at 12:15:32
29: Write 12:15:30 read at 12:15:32
30: Write 12:15:31 read at 12:15:32
从这里我可以清楚地看到:
- 每次运行命令时,它都会获取写入文件的最新行。即缓存没有问题,也没有需要刷新的缓冲区。
- 只读取一行,然后在另一个窗口中运行的命令完成之前不会出现进一步的输出。
- 一旦完成,所有未决行将一起出现。这一定是由关闭文件的源程序触发的。
另外,当我在另外两个窗口中运行 Get-Content 命令重复练习时,一个窗口读取第 3 行,然后等待,另一个窗口读取第 6 行,因此该行肯定被写入文件。
-Wait 选项正在等待文件关闭事件,而不是等待广告中的 1 秒,这似乎很有定论。文档有误。
编辑:
我应该补充一点,因为 Adi Inbar 似乎坚持认为我错了,我在这里给出的示例仅使用 Powershell,因为这似乎最适合 Powershell 讨论。我还使用 Python 验证了行为与我描述的完全一样:
如果应用程序已刷新其缓冲区,则写入文件的内容可由新的Get-Content -Wait 命令立即读取。
使用Get-Content -Wait 的 Powershell 实例将不会在正在写入的文件中显示新内容,即使稍后启动的另一个 Powershell 实例看到后面的数据。这最终证明 Powershell 可以访问数据,并且Get-Content -Wait 不是以 1 秒的间隔轮询,而是在下一次查找数据之前等待某个触发事件。
dir 报告的文件大小在添加行时正在更新,因此不是 Powershell 等待更新目录条目大小的情况。
当写入文件的进程关闭它时,Get-Content -Wait 几乎会立即显示新内容。如果它一直等到数据被刷新到磁盘,则在 Windows 刷新它的磁盘缓存之前会有一个延迟。
@AdiInbar,恐怕您不了解 Excel 在保存文件时的作用。仔细看看。如果您正在编辑test.xlsx,那么在同一文件夹中还有一个隐藏文件~test.xlsx。使用dir ~test.xlsx -hidden | select CreationTime 查看它的创建时间。保存您的文件,现在test.xlsx 将拥有来自~test.xlsx 的创建时间。换句话说,保存在 Excel 中会保存到 ~ 文件,然后删除原始文件,将 ~ 文件重命名为原始名称并创建一个新的 ~ 文件。那里有很多打开和关闭。
在您保存之前,您正在查看的文件处于打开状态,而在该文件打开之后,它却是一个不同的文件。我认为 Excel 的场景过于复杂,无法准确说明是什么触发了 Get-Content 来显示新内容,但我敢肯定你误解了它。