1

我有一些工作,我想要一个不错的输出。目前使用这个:

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($_.psendtime, get-date)[0]

谢谢你的帮助!

4

1 回答 1

4

正如@rokumaru 指出的那样,您缺少else表达式中的块,因此您将返回 ascriptblock而不是计算结果加上语句结果(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参数。

于 2019-03-07T18:29:33.600 回答