PowerShell比对文件修改时间与存储日期时报错如何解决
错误原因
- 类型与格式兼容问题:你将日期时间转为
dd/MM/yyyy hh:mm:ss格式的字符串写入文本,读取后得到的是string类型值,直接和LastWriteTime(DateTime类型)比较时,PowerShell会按当前系统默认的区域日期格式尝试自动转换字符串,一旦存储的日期格式和系统默认格式不匹配(例如系统默认是月/日/年排序,23/06/2022会被识别为月份值23,超出合法范围),就会抛出类型转换错误。 - 读取命令参数错误:
Get-Content的-TotalCount参数传-1是无效值,读取文件第一行正确参数应为1。 - 路径拼接不规范:直接写
$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
相关产品推荐
相关产品推荐

