如何从PowerShell cmdlet输出提取时间戳,筛选运行超24小时的任务
如何从Get-JAMSEntry输出中提取运行时长并筛选超过24小时的任务?
问题描述
我在PowerShell中执行了以下cmdlet:
Get-JAMSEntry -Name * -Server xxxxxx -State Executing得到的输出如下:
Entry Name Description ----- ---- ----------- 1 Sample Executing, elapsed time: 602.18:57:06. 3 Sample Executing, elapsed time: 481.18:57:02. 5 Sample Halted , elapsed time: 484.18:56:58. 7 Sample Hold, elapsed time: 680.18:56:55. 7 Sample Executing, elapsed time: 680.18:56:54. 7 Sample Executing, elapsed time: 680.18:56:53. 9 Sample Halted, elapsed time: 666.18:57:09. 1 Sample halted, elapsed time: 684.18:57:01.我希望从中提取时间戳,筛选出运行时长超过24小时的任务,恳请帮助。
解决方案
要实现这个需求,核心是把输出里的时长字符串转换成PowerShell能计算的TimeSpan对象,然后进行筛选。咱们分两步来做:
1. 提取并转换运行时长
首先,我们可以通过计算属性从Description字段中提取时长,并把它转换成TimeSpan。这里用正则表达式匹配时长格式,再调整格式让PowerShell能解析:
Get-JAMSEntry -Name * -Server xxxxxx -State Executing | Select-Object Entry, Name, Description, @{ Name = 'ElapsedTime' Expression = { # 匹配"elapsed time: 数字.时:分:秒."格式的内容 if ($_.Description -match 'elapsed time: (\d+\.\d+:\d+:\d+)\.') { # 把点号替换成冒号,转换成TimeSpan支持的"天:时:分:秒"格式 $timeStr = $matches[1] -replace '\.', ':' [TimeSpan]::Parse($timeStr) } } }
执行这段代码后,你会看到每条记录多了一个ElapsedTime字段,里面是标准的时间跨度对象(比如602.18:57:06会变成602天18小时57分6秒)。
2. 筛选超过24小时的任务
在上面的基础上,添加Where-Object就能过滤出时长超过24小时的任务:
Get-JAMSEntry -Name * -Server xxxxxx -State Executing | Select-Object Entry, Name, Description, @{ Name = 'ElapsedTime' Expression = { if ($_.Description -match 'elapsed time: (\d+\.\d+:\d+:\d+)\.') { $timeStr = $matches[1] -replace '\.', ':' [TimeSpan]::Parse($timeStr) } } } | Where-Object { $_.ElapsedTime -gt [TimeSpan]::FromHours(24) }
如果不想额外显示ElapsedTime字段,只想输出原始符合条件的记录,可以简化成:
Get-JAMSEntry -Name * -Server xxxxxx -State Executing | Where-Object { if ($_.Description -match 'elapsed time: (\d+\.\d+:\d+:\d+)\.') { $timeStr = $matches[1] -replace '\.', ':' $elapsed = [TimeSpan]::Parse($timeStr) # 判断是否超过24小时 $elapsed -gt [TimeSpan]::FromHours(24) } else { $false # 没有匹配到时长的记录直接排除 } }
小提示
- 如果你的
Description字段格式有细微变化(比如空格、大小写),可以调整正则表达式,比如用-match '(?i)elapsed time:'来忽略大小写匹配。 - 如果遇到解析失败的情况,可以先输出
$matches[1]看看提取到的字符串是否正确,再调整格式替换的逻辑。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

