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

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]原因,但是我又失败了。

谢谢您的帮助!

最佳答案

正如@rokumaru指出的那样,您在表达式中缺少else块,因此您将返回scriptblock而不是返回以及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参数。

08-07 21:17