PowerShell注册表日期字符串转换失败:ParseExact无法转换日期
解决ParseExact日期转换失败及后续时间计算问题
核心问题及原因
- 注册表值获取方式错误:
Select-Object 'Dummy'返回的是带有Dummy属性的自定义对象,不是纯字符串,导致后续无法直接用于日期转换(错误提示中@{dummy=2022-10-18T12:40:25}就是对象的字符串表示)。 - 日期格式字符串不匹配:你用的
dd/MM/yyyy HH:mm和目标字符串2022-10-18T12:40:25的格式完全不符,且ParseExact的第一个参数必须是字符串,不能是对象。 - 变量未正确更新:即使日期转换成功,你也没把结果存回
$startdate,导致New-TimeSpan依然用原始对象而非日期类型。
修正后的代码
# 提取注册表中Dummy属性的纯字符串值 $startdateStr = Get-ItemProperty -Path 'HKLM:SOFTWARE\Adobe\Acrobat Distiller\DC\Installer\' | Select-Object -ExpandProperty Dummy # 转换为DateTime对象(ISO8601格式可直接转换) $startdate = [datetime]$startdateStr # 若要显式用ParseExact,需匹配正确格式 # $startdate = [datetime]::ParseExact($startdateStr, 'yyyy-MM-ddTHH:mm:ss', $null) $today = [datetime]::Now $timeSpan = New-TimeSpan -Start $startdate -End $today "{0} days have passed since {1}" -f $timeSpan.Days, $startdate.ToString('yyyy-MM-dd HH:mm:ss')
关键细节
Select-Object -ExpandProperty Dummy会直接返回属性的实际值,而非包含属性的对象,解决后续类型不匹配问题。- 你的目标字符串是标准ISO8601格式,PowerShell支持直接将其转换为
DateTime类型,无需额外指定格式;如果一定要用ParseExact,格式字符串必须严格对应:yyyy-MM-ddTHH:mm:ss。 - 必须将转换后的日期对象赋值给
$startdate,确保New-TimeSpan能正确识别日期参数。
内容的提问来源于stack exchange,提问作者Stephen McFall
相关产品推荐
相关产品推荐

