文件LastWriteTime与CreationTime不一致的技术疑问及解决思路
PowerShell中文件LastWriteTime与CreationTime看似相等却比较为False的原因及解决方法
你遇到的这个问题其实挺常见的,核心根源在于Windows文件系统里的时间戳存储了比默认显示更高的精度——具体到毫秒甚至微秒级别,而PowerShell默认输出时会把这些高精度部分隐藏起来,所以看起来两个时间完全一致,但实际底层的数值是存在细微差别的。
先看你给出的实际测试示例:
PS 09:30 C:\src\t >Get-ChildItem .\uu.txt | Select-Object -Property Name,LastWriteTime,CreationTime Name LastWriteTime CreationTime ---- ------------- ------------ uu.txt 2019-08-09 09:23:25 2019-08-09 09:23:25 PS 09:30 C:\src\t >Get-ChildItem .\uu.txt | ForEach-Object { $_.LastWriteTime -eq $_.CreationTime } False
这里Select-Object的输出只展示到秒,但LastWriteTime和CreationTime本质是DateTime对象,它们存储的精度远高于秒。当你用-eq直接比较这两个对象时,PowerShell会精确对比它们的完整时间值,哪怕是几微秒的差异都会让比较结果返回False。
至于你问的“是否只能通过ToString方式进行比较”——其实用ToString格式化到秒的话,确实能让字符串比较返回True,但这种方法不够严谨:如果遇到两个时间差在秒内但实际需要区分的场景,ToString会直接忽略掉这些差异。更稳妥的方式还是像你后来做的那样,判断两个时间的差值是否在可接受的范围内。
你采用的解决代码就很合理:
$CloseEnough = New-Timespan -Seconds 1 Get-ChildItem -File -Path 'C:\src\t' | Where-object { ($_.LastWriteTime - $_.CreationTime) -lt $CloseEnough }
这个逻辑允许时间戳存在细微的精度误差,只要差异在1秒内就认为符合“创建后仅写入一次”的预期,完全贴合你的需求。
如果想要直观看到这两个时间的高精度差异,可以用ToString显示完整的时间细节:
Get-ChildItem .\uu.txt | ForEach-Object { Write-Host "LastWriteTime: $($_.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss.fffffff'))" Write-Host "CreationTime: $($_.CreationTime.ToString('yyyy-MM-dd HH:mm:ss.fffffff'))" }
运行后你就能清楚看到两个时间在毫秒/微秒级别的不同了。
内容的提问来源于stack exchange,提问作者lit
相关产品推荐
相关产品推荐

