PowerShell 检索近2天写入文件异常:$date1计算正确但未匹配到目标文件
排查结论
核心异常来自Where-Object语句里的文件属性拼写错误,与$date1的计算值完全无关。
问题根因
- 代码中用于比较文件修改时间的属性写的是
$_.LastwrittenTime,但PowerShell中文件对象对应的修改时间属性,正式拼写为LastWriteTime(用的是动词Write的原形,不是过去式Written)。 - PowerShell访问不存在的对象属性时不会抛出报错,只会静默返回
$null值。也就是说你代码里写的这个属性,实际从每个文件中读取到的时间都是空值。 - 当
$null和DateTime类型的$date1执行-ge比较时,结果永远为False,所有目录下的文件都会被过滤掉。最终管道中没有任何内容传入Out-File,生成的Hiscoregames.txt就是0字节的空文件,看起来就像返回了0个匹配结果。
修正方案
把Where-Object行的属性名改成正确拼写即可:
Get-ChildItem -Path D:\HyperSpin\Emulators\Mame\hi | Where-Object {$_.LastWriteTime -ge $date1} | Out-File -FilePath D:\HyperSpin\Emulators\Mame\Hitxt\Hiscoregames.txt
排错验证技巧
如果后续遇到类似的属性匹配问题,可以先查看目录下单个文件的所有属性列表确认正确拼写:
# 取目录下第一个文件的所有属性成员列表 Get-ChildItem -Path D:\HyperSpin\Emulators\Mame\hi | Select-Object -First 1 | Get-Member -MemberType Property
输出列表中找到对应时间项的名称,就是准确的属性拼写,能避免类似的拼写踩坑。
内容的提问来源于stack exchange,提问作者shayster01
相关产品推荐
相关产品推荐

