You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell比对文件修改时间与存储日期时报错如何解决

错误原因
  1. 类型与格式兼容问题:你将日期时间转为dd/MM/yyyy hh:mm:ss格式的字符串写入文本,读取后得到的是string类型值,直接和LastWriteTime(DateTime类型)比较时,PowerShell会按当前系统默认的区域日期格式尝试自动转换字符串,一旦存储的日期格式和系统默认格式不匹配(例如系统默认是月/日/年排序,23/06/2022会被识别为月份值23,超出合法范围),就会抛出类型转换错误。
  2. 读取命令参数错误:Get-Content的-TotalCount参数传-1是无效值,读取文件第一行正确参数应为1。
  3. 路径拼接不规范:直接写$path'lastchange.txt'属于不严谨的写法,容易出现斜杠缺失/多余导致的路径错误。
修复方案

推荐使用第一种方案,完全规避系统区域设置带来的格式兼容问题:

方案1:存储标准化时间格式(最稳妥)

放弃容易产生歧义的自定义日期存储格式,改用系统通用的可序列化时间格式,读写全程不需要额外处理格式兼容:

修改写入lastchange.txt的脚本

$path = 'C:\'
# 使用通用可排序的往返时间格式存储,不受系统区域设置影响
$lastchange = Get-Date -Format 'o'
# 加-Force参数覆盖已有文件不报错
New-Item -Path $path -Name 'lastchange.txt' -ItemType "file" -Value $lastchange -Force

修改文件检索比对脚本

读取内容后显式转为DateTime类型再做比较,同时修正路径拼接、参数错误:

$pathfiles = 'C:\filestochange\'
$path = 'C:\'
# 用Join-Path规范拼接路径,读取内容后显式转DateTime类型
$lastchange = [DateTime]::Parse((Get-Content -Path (Join-Path $path 'lastchange.txt') -TotalCount 1))
$files = Get-ChildItem $pathFiles -Filter *.html | Where-Object {$_.LastWriteTime -gt $lastchange}

方案2:保留原有自定义格式,读取时指定解析规则

如果你必须保留dd/MM/yyyy hh:mm:ss的存储格式,读取时不要依赖系统默认转换规则,手动指定匹配的格式解析即可:

$pathfiles = 'C:\filestochange\'
$path = 'C:\'
$dateStr = Get-Content -Path (Join-Path $path 'lastchange.txt') -TotalCount 1
# 按写入时的固定格式显式解析为DateTime,不受系统区域设置影响
$lastchange = [DateTime]::ParseExact($dateStr, 'dd/MM/yyyy hh:mm:ss', $null)
$files = Get-ChildItem $pathFiles -Filter *.html | Where-Object {$_.LastWriteTime -gt $lastchange}
注意事项

所有时间比较场景,必须保证比较运算符两边都是DateTime类型,不要直接拿字符串和DateTime类型值比较,否则除了类型转换错误,还可能出现字符串按字符排序和时间先后逻辑不一致的问题。

内容的提问来源于stack exchange,提问作者Magskull

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 01:09:19