Powershell 中的 LastWriteTime 仅在文件读取时更新?

问题描述 投票:0回答:1

TLDR; LastWriteTime 仅在读取文件时更新?

我有一个日志,正在不断写入。 有时,它会滚动并使用新文件名创建新日志。 我写了一个小脚本来获取与掩码匹配的最新文件:

gci $mask | Sort-Object LastWriteTime -Descending | Select-Object -First 1

只有它不起作用,因为当文件滚动到新文件时,它会打开新文件,然后在旧文件中写入几行以关闭,最后以晚于创建时间的 LastWriteTime 结束新的。 然后,Powershell 继续将新文件视为 0 字节文件,并且不会更新其“LastWriteTime”。 尽管文件被不断写入。 几个小时。 如果我打开该新文件并在文本编辑器中读取它,它每次都会立即更新时间戳和大小。 如果我对该文件对象或其包含目录调用 Refresh(),它不会更新数据。

PS C:\Users\user\Documents> gci $mask |Sort-Object LastWriteTime -Descending | Select-Object -First 1

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       16/10/2024  13:58:33         623766 ResponderService_F0711118_7268_20241016.log

PS C:\Users\user\Documents> gci $mask |Sort-Object LastWriteTime -Descending | % {$_.Refresh()}
PS C:\Users\user\Documents> gci $mask |Sort-Object LastWriteTime -Descending | Select-Object -First 1

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       16/10/2024  13:58:33         623766 ResponderService_F0711118_7268_20241016.log

但是如果我读取文件的内容并将它们转储到 $null 它会更新:

PS C:\Users\user\Documents> gci $mask |Sort-Object LastWriteTime -Descending | gc > $null
PS C:\Users\user\Documents> gci $mask |Sort-Object LastWriteTime -Descending | Select-Object -First 1

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       16/10/2024  14:02:56         636468 ResponderService_F0711118_7268_20241016.log

尽管事实上它是每隔几秒钟就被写入的——我向你保证。 这不仅仅是日志记录过程中的写入缓冲区被间歇性刷新的问题;正如我所说,这可能会持续数小时和兆字节的日志记录,而无需更新文件属性,或者如果我读取文件内容以强制其更新,则每隔几秒更新一次。 每次我读取文件时,我总是可以看到文件中最后几秒的时间戳。

谁能向我解释一下这是怎么回事,为什么这不是完全疯狂? 或者告诉我我在做什么蠢事? 仅当文件被read时更新的LastWriteTime有什么用?

powershell filesystems
1个回答
0
投票

这不是 Powershell,而是文件系统 (NTFS)。在某些条件满足之前,它似乎不会更新其他应用程序可用的时间信息。对于保持打开状态的日志文件来说,这尤其令人不快 - 目录枚举表明它们是空的,但如果您打开它们,数据就在那里。

除了 writer 之外,似乎不存在其他进程的解决方案。即使您在一个进程中对文件执行所有操作,对于向 NTFS 发送一些 IRP 请求以尝试获取有关文件的当前信息之类的操作来说,脚本可能级别太高。

© www.soinside.com 2019 - 2024. All rights reserved.