Powershell Get-Job格式表计算属性

时间:2019-03-07 17:32:46

标签: powershell properties formattable

我有一些工作,我想要一个不错的输出。当前正在使用此:

Get-Job | Format-Table -Property name, state, @{n = 'Started'; e = {$($_.psbegintime).tostring("HH:mm:ss")}}, @{n = 'Completed'; e = {$($_.psendtime).tostring("HH:mm:ss")}}

我想用n = 'Elapsed'再创建一列。
如果作业正在运行,则应计算

$(get-date) - $_.psbegintime

如果作业完成,则应该计算

$_.psendtime - $_.psbegintime

我尝试了$(if ($_.state -ieq "running") {$(get-date) - $_.psbegintime} {$_.psendtime - $_.psbegintime}),但是它的输出很奇怪:{00:00:05.0532890, $($_.psendtime - $_.psbegintime)}
我以为可以替换$_.psendtime值(null的{​​{1}}原因,但是我又失败了。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:4)

正如@rokumaru指出的那样,您缺少表达式中的else块,因此您返回的是scriptblock而不是计算结果 plus if语句结果是否成功。

我建议您分解代码以使其更具可读性(尤其是在脚本中):

#requires -Version 4

$prop = @{
    'PipelineVariable' = 'job'
    'Property'         = @(
        'Name', 'State'
        @{ Name = 'Started'; Expression = { $job.PSBeginTime.ToString('HH:mm:ss') } }
        @{ Name = 'Completed'; Expression = { $job.PSEndTime.ToString('HH:mm:ss') } }
        @{
            Name       = 'Elapsed'
            Expression = {
                if ($job.State -eq 'Running') {
                    ((Get-Date) - $job.PSBeginTime).ToString('HH:mm:ss')
                }
                else {
                    ($job.PSEndTime - $job.PSBeginTime).ToString('HH:mm:ss')
                }
            }
        }
    )
}
Get-Job | Format-Table @prop

about_CommonParameters:请参见PipelineVariable

about_Splatting

Calculated Properties:请参见Property参数。