请求调整PowerShell单行脚本:将日期字符串转为[datetime]类型
将日志提取的日期字符串转换为PowerShell [datetime]类型
原脚本与输出
原PowerShell单行脚本:
Select-String -Path "C:\temp\TrackerLog.log" -Pattern "Program exited successfully" | Foreach-Object Line | Foreach {$_ -replace "\["} | %{ $line = $_.Split(' ') ; write-host $line[0] $line[1]}
执行后输出的日期时间字符串示例(带HTML标签):
<p>14.03.2022 08:12:38</p> <p>21.03.2022 12:36:36</p> <p>29.03.2022 19:39:59</p> <p>04.04.2022 11:05:44</p> <p>11.04.2022 13:08:49</p> <p>18.04.2022 09:48:50</p> <p>27.04.2022 06:18:45</p> <p>02.05.2022 10:41:26</p> <p>10.05.2022 04:25:48</p> <p>18.05.2022 04:56:44</p> <p>26.05.2022 03:32:25</p> <p>28.05.2022 10:18:00</p> <p>04.06.2022 22:49:16</p> <p>07.06.2022 02:31:08</p>
解决方案
要将这些字符串转换为[datetime]类型,核心是先清理冗余字符,再按固定格式精确解析,修改后的脚本如下:
# 提取日志行并转换为datetime对象 $dateTimeObjects = Select-String -Path "C:\temp\TrackerLog.log" -Pattern "Program exited successfully" | ForEach-Object { $_.Line -replace "\[", "" } | # 移除左方括号 ForEach-Object { ($_ -split ' ')[0,1] -join ' ' } | # 提取日期时间部分 ForEach-Object { $_ -replace '<p>|</p>', '' } | # 去除HTML标签 ForEach-Object { # 按指定格式解析为datetime,格式对应:日.月.年 时:分:秒 [datetime]::ParseExact($_, 'dd.MM.yyyy HH:mm:ss', $null) } # 输出转换后的datetime对象(可直接用于后续处理) $dateTimeObjects
关键细节
- 替换
Write-Host:原脚本用Write-Host仅向控制台输出文本,无法留存数据做后续处理,修改后直接返回处理后的字符串 - 清理冗余内容:通过
-replace移除HTML标签和多余符号,得到纯日期时间字符串 - 精确解析:使用
[datetime]::ParseExact指定格式,避免系统区域设置差异导致的解析失败,因为你的日期格式是固定的日.月.年 时:分:秒
后续处理示例
得到[datetime]对象后,可执行各类时间相关操作:
# 筛选2022年5月及之后的记录 $dateTimeObjects | Where-Object { $_.Year -eq 2022 -and $_.Month -ge 5 } # 计算首尾记录的时间差 $timeSpan = $dateTimeObjects[-1] - $dateTimeObjects[0] Write-Host "总运行间隔:$($timeSpan.TotalDays) 天"
内容的提问来源于stack exchange,提问作者Johny
相关产品推荐
相关产品推荐

