PowerShell 7.2.4中字符串转DateTime对象报错如何解决
问题根因
PowerShell 7重构了Web响应头的返回逻辑:所有响应头字段的值统一以System.String[]字符串数组类型存储,即使对应头只有1个有效值,也会被包装为单元素数组返回。这和PowerShell 5直接返回单个字符串的行为存在差异,直接将数组强转为DateTime类型自然会触发类型不匹配错误。
修复方案
HTTP协议规定Last-Modified响应头只会返回单个时间值,只要先从数组中取出第一个元素,再执行类型转换即可正常运行:
$result = Invoke-WebRequest -Method HEAD -Uri "https://microsoft.com" -UseBasicParsing -ErrorAction:Stop -TimeoutSec 30 $LastModifiedDateTime = [DateTime] $result.Headers['Last-Modified'][0]
跨PowerShell版本兼容写法
如果需要同一段代码同时适配PowerShell 5和PowerShell 7环境,可以先判断响应头返回值的类型,再做取值转换,避免版本差异导致的报错:
$result = Invoke-WebRequest -Method HEAD -Uri "https://microsoft.com" -UseBasicParsing -ErrorAction:Stop -TimeoutSec 30 $headerValue = $result.Headers['Last-Modified'] # 兼容单字符串、字符串数组两种返回格式 $lastModifiedStr = $headerValue -is [array] ? $headerValue[0] : $headerValue $LastModifiedDateTime = [DateTime] $lastModifiedStr
上述写法会自动适配不同操作系统、不同系统语言返回的日期格式(包括GMT标准格式、各语种本地化日期格式),不需要额外指定日期解析规则,转换逻辑和PowerShell 5环境下的表现完全一致。
内容的提问来源于stack exchange,提问作者Paddy
相关产品推荐
相关产品推荐

